等待在action-target函数中使用runloop runmode进行异步调用

时间:2014-07-17 02:14:35

标签: objective-c cocoa grand-central-dispatch

我在NSOutlineView的目标操作点击中运行此代码。目标是在从NSOutlineView上的新点击开始新请求之前完成每个请求(最初是Web服务请求)。这样可行,但在第三次单击时UI将无响应,直到当前异步调用完成。我缺少什么?

- (void) showMarket:(NSString *)market sender:(id) sender {

    do {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    } while (loadingMarket);

    loadingMarket = true;

    NSLog(@"loading market %@", market);
    [sender beginProgress:self];


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"loaded market %@", market);
        [sender endProgress:self];
        loadingMarket = false;
    });




}

1 个答案:

答案 0 :(得分:1)

从同一个currentRunLoop调用currentRunLoop完全不是一个好主意。我不认为它是可重入的。使用串行调度队列进行串行任务。看看the Apple document