2017-08-24 65 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

相關問題