我需要處理大量來自NSDictionary
的數據到NSManagedObjects
(3k-10k對象)。Objective C和線程
在同步處理中,3K花費約60秒:
for (NSString *key in myDictionary) {
//process data
}
當我使用GCD和用於每個鍵創建一個新的線程,大約需要20秒,使用一串線程:
for (NSString *key in myDictionary) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//process data
}
}
然後我試圖使用NSOperationQueue
與NSBLockOperation
和用於每個鍵,添加塊執行歷時約30秒和只用2個線程:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
for (NSString *key in myDictionary) {
[operation addExecutionBlock:^{
// processs data
}
}
[operation setCompletionBlock:^{
DLog(@"Block completed | time: %f", [[NSDate date] timeIntervalSinceDate:startTime]);
}];
[queue addOperation:operation];
這給出了具有完成塊的優點。
就速度而言,每個按鍵的線程似乎是最快的。
所有時間在設備上完成,而不是模擬器。
我讀過NSOperation
vs GCD,他們建議使用更高層次的API,即NSOperation
,但GCD的性能更好。
使用NSOperationQueue
和NSBlockOperation
除完成塊外還有什麼優勢嗎?或者我錯過了一些讓隊列和塊本來就比GCD更好的東西?
相關:http://stackoverflow.com/questions/18632271/what-is-the-差異之間的nsinvocationoperation和nsblockoperation –
在Objective-C中有大約六種不同的線程方式。除非有特別的理由選擇其中一種,否則使用你理解最好並且最舒服的技術。線程混淆不清,在複雜情況下使用不熟悉的界面只會增加混淆。 –