所以我正在使用performSelectorInBackground:@selector(loadStuff)
在后台加载内容。这需要一些时间。
用户可能想要重新加载项目,而上述方法在后台运行。如果我再次performSelectorInBackground:@selector(loadStuff)
而其他方法已经运行,我会收到各种错误。
有没有一种简单的方法来处理这种情况?
我想停止已经在后台运行的方法,然后启动新方法。 (或者,如果有更好的方法来实现最终目标,那也没关系。)
答案 0 :(得分:2)
如果要重新开始,可以取消连接并创建一个新连接。由于您要在后台线程上运行此方法,因此您需要确保一次只能有一个线程访问相关的实例变量:
- (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;
}
}