/ 开发笔记

XCode使用Reachability库提示“ui api called on a background thread”

问题背景

使用了一个检查网络状态的库(Reachability),希望在收到网络状态正常的消息时,再进行admob的初始化。结果调试时,发现XCode提示了这个错误:

ui api called on a background thread

值得一提是,功能上似乎没有什么影响。不过,为了防止意外,还是想办法处理一下。

解决方法

在收到网络状态变化时,发送消息到主线程进行处理。根据Reachability的文档,有两种方法:

  1. NSOperationQueue.mainQueue.addOperationWithBlock
// to update UI components from a block callback
// you need to dipatch this to the main thread
// this uses NSOperationQueue mainQueue
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 这里调用只能在UI线程里进行的操作
}];
  1. dispatch_async(dispatch_get_main_queue(), ...)
// to update UI components from a block callback
// you need to dipatch this to the main thread
// this one uses dispatch_async they do the same thing (as above)
dispatch_async(dispatch_get_main_queue(), ^{
// 这里调用只能在UI线程里进行的操作
});

参考

  1. 苹果官方文档 https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
  2. 网络状态监测库 https://github.com/tonymillion/Reachability