【问题标题】:Waiting for a background thread to complete before function return在函数返回之前等待后台线程完成
【发布时间】:2016-08-13 18:55:12
【问题描述】:

我尝试创建将 Internet 状态返回为 Bool 的函数:

func isConnectedToNetwork()->Bool{
    var InternetStatus = Bool()
    RealReachability.sharedInstance().reachabilityWithBlock { (status:ReachabilityStatus) in
        switch status {
        case .RealStatusNotReachable:
            InternetStatus = false
        default:
            InternetStatus = true

        }
    }
   return InternetStatus
}

但是我有一个问题,RealReachability.sharedInstance().reachabilityWithBlock {} 在后台线程中工作,并且函数在后台线程完成之前返回。

函数返回前如何等待后台线程结果?

【问题讨论】:

  • 你不能。这一定是最常被问到的 iOS 问题。提问前请在 Stack Overflow 上搜索。搜索异步。例如,请参阅我的答案:stackoverflow.com/a/24520296/341994
  • 我投票结束这个问题,因为它已经在 Stack Overflow 上被多次询问和回答。
  • 马特,你错了!我可以使用信号量来做到这一点!请不要投票结束这个问题。
  • 是的,你可以。但你不应该。所以不要。不。听听您被告知的内容(我、vadian 以及 Stack Overflow 上有关此主题的所有答案)。在访问网络时,信号量会阻塞主线程,不管它需要多长时间。这将挂起您的应用程序界面,甚至可能导致 WatchDog 进程当场杀死您的应用程序。即使挂断时间很短,它仍然是错误的。

标签: swift function reachability background-thread


【解决方案1】:

不要等待,告诉。

使用在异步任务完成时调用的完成处理程序

func isConnectedToNetwork(completion:(Bool -> Void)) {
    RealReachability.sharedInstance().reachabilityWithBlock { (status:ReachabilityStatus) in
        switch status {
        case .RealStatusNotReachable:
            completion(false)
        default:
            completion(true)
        }
    }
}

然后调用它

isConnectedToNetwork { success in
  print(success)
  // do something with the success value
}

【讨论】:

  • vadian,不需要使用完成处理程序...只需要使用信号量...!不过谢谢你的回答!
  • @Dmitry 信号量在这种情况下是非常糟糕的编程习惯。
  • 完成处理程序也是如此,效率更高。
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多