所以我使用performSelectorInBackground:@selector(loadStuff)在后台加载东西.这需要一些时间.
用户可能想要重新加载项目,而上述方法在后台运行.如果我再次执行SelectorInBackground:@ selector(loadStuff)而另一个方法已经运行,我会收到各种错误.
有没有一种简单的方法来处理这种情况?
我想停止已经在后台运行的方法,然后启动新方法. (或者如果有更好的方法来实现最终目标,那也没关系).
最佳答案 如果要重新开始,可以取消连接并创建一个新连接.由于您要在后台线程上运行此方法,因此您需要确保一次只有一个线程可以访问相关的实例变量:
- (void)loadStuff
{
@synchronized(self) {
if (currentConnection != nil)
[currentConnection cancel];
[currentConnection release];
}
currentConnection = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];
}
}
另一种方法是使用标志来指示忙碌状态.例如,如果您想在另一个线程上已经处理长时间运行的方法时返回,则可以执行以下操作:
- (void)loadStuff
{
@synchronized(self) {
if (loadingStuff == YES)
return;
}
loadingStuff = YES;
}
NSURLRequest *request = ...
NSURLResponse *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:request returningReseponse:&response error:&error];
@synchronized(self) {
loadingStuff = NO;
}
}