objective-c – 防止`performSelectorInBackground:`运行两次?

所以我使用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;
    }
}
点赞