防止`performSelectorInBackground:`运行两次?

时间:2011-10-09 07:22:21

标签: objective-c macos cocoa

所以我正在使用performSelectorInBackground:@selector(loadStuff)在后​​台加载内容。这需要一些时间。

用户可能想要重新加载项目,而上述方法在后台运行。如果我再次performSelectorInBackground:@selector(loadStuff)而其他方法已经运行,我会收到各种错误。

有没有一种简单的方法来处理这种情况?

我想停止已经在后台运行的方法,然后启动新方法。 (或者,如果有更好的方法来实现最终目标,那也没关系。)

1 个答案:

答案 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;
    }
}