2017-08-24 28 views
-2

我有一个被多次调用的方法。但我只需要在最后的方法调用中采取行动。我试图dispatch_async,但没有工作,因为仍然被呼叫排队:Objective-C:等待方法中的最后一个调用

-(void)doingSomething:(NSString*)someValue 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [NSThread sleepForTimeInterval:1.0f]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // do something with the last call 
     }); 
    }); 
} 

任何你知道的方式呼叫排队,并且只使用了非常最后一次通话?

我会很感激你的帮助

+0

你想等待最后一次做什么呼叫或你是什么意思。我害怕我根本没有得到它 –

+0

[在布局子视图中实现Cocoa Touch中的去抖整合模式](https://stackoverflow.com/q/28153632) –

回答

2

我的建议是使用dispatch_group。致电dispatch_async之前致电dispatch_group_enter,并致电dispatch_group_leave,并由dispatch_async执行该块的结尾。然后,在将所有块排入队列之后,使用dispatch_group_notify安排完成块,该块将在所有其他dispatch_async块完成后运行。

dispatch_group_t group = dispatch_group_create(); 

for (...) { 
    dispatch_group_enter(group); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     ... 
     dispatch_group_leave(group); 
    }); 
} 

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    // This gets called when all the other blocks have finished 
}); 

或者,你可以使用一个NSOperationQueue代替libdispatch,并完成操作,其中列出所有其他操作的依赖。但是,这有一个缺点,即完成操作不会在主队列上执行。

NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{ 
    // This gets called when all the other operations have finished 
}]; 

for (...) { 
    NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
     ... 
    }]; 

    [completionOperation addDependency:operation]; 
    [operationQueue addOperation:operation]; 
} 

[operationQueue addOperation:completionOperation]; 
+0

NSOperationQueue如何使用最后一次调用方法? – user2924482

+0

我添加了一个基于NSOperationQueue的例子作为编辑。 –

+0

来自你的两个例子。所有对该方法的调用都将被执行。看看你的示例实现,最后一次调用是如何执行的唯一一次调用? – user2924482

相关问题