在iphone中定期更新tableview

时间:2011-09-01 05:50:43

标签: iphone

我创建了一个示例应用程序。它每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...

我的代码出了什么问题?崩溃是随机出现的。

1 个答案:

答案 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而不是线程。