gpt4 book ai didi

ios - Swift 函数返回得不够快

转载 作者:行者123 更新时间:2023-11-30 13:56:33 25 4
gpt4 key购买 nike

我正在尝试将我的应用程序移至 MVC,我有一个解析查询,我已将其移至模型类中的一个函数,该函数返回一个 Bool。

当按下下面的 ViewController 中的按钮时,应该运行模型函数“parseQuery”,返回一个 bool 值,然后我需要使用该 bool 值继续。目前,if 语句在函数完成之前执行,因此它总是检测到 false。

如何确保函数完成后 if 语句也完成?

@IBAction func showAllExpiredUsers(sender: AnyObject) {

var success = searchResults.parseQuery()

if success {
print("true")
} else {
print("false")
}
//I have also tried:

searchResults.parseQuery()

if searchResults.parseQuery() {
print("true")
} else {
print("false")
}

最佳答案

您有几个选择,但问题是由于异步调用造成的。

Parse 是否公开相同的函数,并带有完成 block ?

如果是,则将 Bool 的处理放在完成 block 中,该完成 block 在异步任务完成时调用。

如果没有,我对此表示怀疑,您可以创建一个 NSOperationQueue,其 maxConcurrency 为 1(因此它是串行的),并将调用分派(dispatch)到队列中

func addOperationWithBlock(_ block: () -> Void)

这在队列上调用。您需要全局存储 success bool,以便可以在第二个排队 block 操作中访问它,以检查成功状态。

更新:

我没有使用过解析,但是检查 findObjectsInBackgroundWithBlock ( https://parse.com/docs/ios/guide#queries ) 的文档,它需要一个完成 block ,您可以在其中处理结果,更新您的 bool 值。

我不确定你想做什么。您不需要查询的成功状态。您可以查看一下

if (!error) { 
// do stuff
} else {
//error occurred - print("error \(error.localizedDescription)"
}

检查示例。

你需要了解的是线程。异步任务提供了一个完成 block ,因为它是异步的,它被分派(dispatch)到另一个线程进行处理。我不确定您对线程了解多少,但有一种叫做线程池的东西。该线程池由队列访问。线程池由操作系统管理,并确保需要完成工作的队列可以使用可用线程。当用户与应用程序交互时,此操作(以及所有 UI 工作)都是在主线程上完成的。

因此,每当某些处理会干扰可能的交互或 UI 更新时,就应该将其分派(dispatch)(Grand Central Dispatch)或从主线程排队(NSOperationQueue,构建在 GCD 之上)。

无论如何,这就是为什么 findObjectsInBackgroundWithBlock 调用从主线程分派(dispatch)的原因,因为否则它将阻塞主线程直到完成,从而破坏用户的体验。另外,如果主线程被阻塞超过 1 分钟(我上次检查时),操作系统的看门狗将杀死您的进程。

所以,是的,为 block 的返回值分配一个 bool 值,将获得函数的返回值,这发生在完成 block 完成之前。完成 block 是您编写函数完成后要完成的一些事情的地方。因此,查询被分派(dispatch)到另一个线程并开始处理,发送此工作进行处理的线程将继续执行其余部分。因此,直接检查 bool 值是行不通的,因为另一个线程尚未完成。即使其他线程及时完成,后台线程与主线程的连接又是什么呢?

这就是 block (函数指针)的美妙之处,它更加干净和优化,并且保持代码紧凑。一些旧框架仍然使用的旧方法是委托(delegate),它将调用代码与回调分离并添加委托(delegate)依赖项。 block 很漂亮。

还需要注意的是,完成 block 并不总是在主线程上调用。在许多情况下,您可以将工作分派(dispatch)回主线程,以处理需要使用完成 block 内可用对象完成的任何 UI 工作。

关于ios - Swift 函数返回得不够快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33550800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com