ios - Swift 函数返回得不够快

标签 ios swift model-view-controller parse-platform

我正在尝试将我的应用程序移至 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/

相关文章:

java - 在 Spring MVC 中显示来自 Controller 的 View (所有员工的列表)

ios - 在 MKMapView 中覆盖城市、地区等

ios - 无法加载单元测试的底层模块

html - iOS设备上的字体粗细问题

swift - SKEase action,如何使用Float changing Action Setter Block?

java - 无法使用 Facebook 的 API、使用 MVC 和 Java 发布消息

ios - 返回 NSString 而不是 NSDictionary

ios - 通过数据创建 UIImage 时崩溃

ios - UITextField 在 secureTextEntry 切换后尾随空格

ruby-on-rails - 仅使用默认语言环境的 Rails 模型