【问题标题】:How do you wait for the correct result of a method call?如何等待方法调用的正确结果?
【发布时间】:2016-11-15 02:52:54
【问题描述】:

我有一个方法,由于问题的计算负载,有时需要几秒钟才能返回结果。请注意,这纯粹是一个“离线”问题,该函数不会调用基于 Web 的 API。

目前,每当我要求返回该方法时,它只会返回 nil,因为它仍在另一个线程上处理该函数。

如何编写一个等待函数正确、非零响应的函数?

【问题讨论】:

  • 别等了。让计算函数完成时通知。
  • @vadian。你能举出任何例子吗?当然,这只是将问题进一步推向上游,但这是同一个问题,对吗?
  • 这是同样的问题,但与轮询(等待)不同,它不会浪费任何资源。
  • “当然这只会让问题更进一步” 绝对不是。当您在函数中等待时,您将阻止该线程的执行,如果该函数调用是在 GUI 中进行的,那么对于用户,您的应用程序已挂起并且无法响应用户输入。如果您使用块(闭包)或委托等正确实现它以在操作完成时通知调用代码,则不会发生此阻塞。
  • 你看过苹果的“并发编程指南”吗?

标签: ios asynchronous promise swift3


【解决方案1】:

您应该使用 GCD 将耗时的块分派到后台线程。这里最主要的是不要用硬任务阻塞主线程。

Swift 3 示例:

func doSomethingTimeConsuming(completion: ((Any)->Void)?) {
    DispatchQueue.global(qos: .background).async {
        //do time consuming task in here (background thread)
        //let result = ...
        DispatchQueue.main.async {
            //use callback here (main thread)
            //let's assume the result of your calculation is some object or struct
            completion?(result)
        }
    }
}

Any 替换为您期望从函数中获得的实际结果类型。

用法:

doSomethingTimeConsuming { result in
    //this closure will be called when your time consuming function completes execution
}

【讨论】:

  • 是的,这看起来很有希望,但问题是耗时功能的结果也是视图的主要特征,因此在处理好之前不会发生太多事情。我可以改用完成处理程序在主线程上查找结果吗?
  • @JamesStonehill 如果您想在回调中获得计算结果,请检查更新版本。
猜你喜欢
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2017-09-09
  • 2018-02-04
  • 2015-04-26
  • 2015-11-30
  • 2016-05-24
  • 2021-09-15
相关资源
最近更新 更多