我需要处理大量来自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中有大约六种不同的线程方式。除非有特别的理由选择其中一种,否则使用你理解最好并且最舒服的技术。线程混淆不清,在复杂情况下使用不熟悉的界面只会增加混淆。 –