我在App崩溃跟踪工具中看到了一些崩溃。基本上我有一个tabBarController,其中一个选项卡有一个嵌入式UIWebView,另一个选项卡有一个带UITableView的控制器。那么当用户首先进入WebView并开始加载时,会发生几秒钟后他们转到tableView控制器,随机发生崩溃。
根据我在崩溃日志中看到的时间判断,当用户点击UITableView选项卡时,似乎webView即将完成加载,因此我将代码插入到didFinishLoading中。这样我就可以可靠地重现崩溃。代码如下所示:
webViewController:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[tabBarController gotoTableViewController];
}
tableViewController:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];
}
这是崩溃:
bool _WebTryThreadLock(bool), 0x1700113d0: Multiple locks on web thread not allowed! Please file a bug. Crashing now...
我不知道我能做些什么,似乎webView和tableView都锁定了mainThread?有没有办法去卸货"从主线程加载webView?我试过stopLoading,不工作......
答案 0 :(得分:1)
找到它。它确实是由mainThread上的文件解析引起的。我的文件解析是利用NSRunLoop来解析XML文件。但是,该文件旨在用作缓存值,需要同步解析,因此我将其放在mainThread上。我试图将它放到后台线程并使用dispatch_sync
,崩溃仍在那里。所以我用dispatch_async
尝试dispatch_semaphore_t
,崩溃消失了!
答案 1 :(得分:0)
我遇到了同样的问题,而且我还有一个NSRunLoop
可能会在WebView获取数据时运行。
删除NSRunLoop问题现在已修复,但我不明白为什么问题首先发生。
@KKRocks你能详细说明为什么NSRunLoop会导致WebView在后台运行吗?