Update tableview with regular time intervals in iphone
I have created a sample application. It has fetched data from server for every 1 sec and updated the result in UITableView. I had already done. But it crashes my app rapidly. What I do is call NSTimer every sec.
timer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(MainLoop)
userInfo:nil repeats:YES];
In that timer function i have called NSThread function.
-(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");
}
It works fine. And reloads data correctly from the server. I stop NSTimer in viewWillDisappear
method. When I go to previous page sometimes it crashes application. In console i have seen the error is given below,
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...
What is wrong with my code? Crashes appear randomly.
When I work on my application I discovered very good thing - NSOperation. It's thread safe. You can simply add you operations to the queue without fear to crash. There are a lot of tutorials about 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/
I strongly recommend you use NSOperation-s instead of threads in your project.
精彩评论