我创建了一个示例应用程序。它每1秒从服务器获取数据并在UITableView中更新结果。我已经完成了。但它迅速崩溃我的应用程序。我所做的是每秒致电NSTimer。
timer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(MainLoop)
userInfo:nil repeats:YES];
在那个定时器功能中,我调用了NSThread功能。
-(void)MainLoop
{
if(isPreviousThreadFinished)
{
NSLog(@"Thread Opened");
isPreviousThreadFinished = NO;
[NSThread detachNewThreadSelector:@selector(MainLoopThread) toTarget:self withObject:nil];
}
}
-(void)MainLoopThread
{
MainLoopPool=[[NSAutoreleasePool alloc]init];
//Get data from the server
[self performSelectorOnMainThread:@selector(UpdateTable) withObject:nil waitUntilDone:YES];
[MainLoopPool release];
}
-(void)UpdateTable
{
[self.tableView reloadData];
isPreviousThreadFinished = YES;
NSLog(@"Thread closed");
}
工作正常。并从服务器正确重新加载数据。我在viewWillDisappear
方法中停止了NSTimer。当我转到上一页时有时会崩溃应用程序。在控制台中,我看到错误如下,
bool _WebTryThreadLock(bool), 0xb2aa410: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
我的代码出了什么问题?崩溃是随机出现的。
答案 0 :(得分:0)
当我处理我的应用程序时,我发现了非常好的东西 - NSOperation 。这是线程安全的。您可以简单地将操作添加到队列中,而不必担心崩溃。有很多关于NSOperation的教程
http://www.icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/ http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/
我强烈建议您在项目中使用NSOperation-s而不是线程。