我有一个数组 - 说wordsArray其中wordArray的每个对象是另一个数组 - 说wordList。使用for循环,我选取每个对象(wordList)并调用另一个类的方法-say wordScore,它将返回带有单词和分数的NSDictionary
。不是一个一个地为每个对象调用wordScore,有没有办法让它们平行运行?每个wordList的wordScore应该并行执行,并在执行结束时,每个wordScore的所有NSDictionaries
应合并成一个单一的NSDictionary
。多次并行执行类的执行方法
0
A
回答
1
比方说,我有一些愚蠢像这类
@interface MyWordClass: NSObject
- (NSDictionary *)wordScore:(NSArray *)wordList;
@end
@implementation MyWordClass
- (NSDictionary *)wordScore:(NSArray *)wordList {
NSMutableDictionary *scores = [NSMutableDictionary new];
for (NSString *word in wordList) {
scores[word] = @(word.hash %100);
}
return [scores copy];
}
@end
从这里,我会做的wordsArray
并发枚举。我在每个并发迭代中创建了一个新的MyWordClass
实例。最后,我使用@synchronized
块来累积结果。
NSArray *wordsArray = @[@[@"a", @"b", @"c"], @[@"1", @"2", @"3"]];
NSMutableDictionary *result = [NSMutableDictionary new];
[wordsArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSArray *wordList, NSUInteger idx, BOOL *stop) {
// The scores are being calculated concurrently
NSDictionary *scores = [[MyWordClass new] wordScore:wordList];
@synchronized(result) {
[result addEntriesFromDictionary:scores];
}
}];
NSLog(@"%@", result);
重要拿走的题是:1)做并发枚举,2)不并发块使用共享的情况下,和3)使用@synchronized
块收集的结果。
+0
这个工作很棒! –
相关问题
- 1. 并行执行方法
- 2. 如何多次执行Java方法?
- 3. 类方法执行两次内if()
- 4. 需要在并行执行模式下只执行一次setup方法
- 5. 并行执行相同的@Sceduled方法
- 6. 多次执行WorkflowInstance
- 7. PHP执行多次
- 8. 计划执行程序的计划方法只执行一次
- 9. 并行执行多个NSOperation
- 10. 的setTimeout执行多次
- 11. Rails的AJAX执行多次
- 12. 执行的SwingWorker多次
- 13. 并行执行
- 14. Pycurl执行()方法,writefunc执行模型
- 15. 在春季并行执行多个不同方法的调用
- 16. jQuery的方法执行几次
- 17. 无法从后台执行多个值来执行后执行
- 18. object.hitTestObject(other_object)被执行多次
- 19. 脚本执行很多次
- 20. 从儿童多次执行
- 21. notifyItemChanged动画执行多次?
- 22. MVVM Light Messenger执行多次
- 23. - [SKScene didBeginContact]执行多次
- 24. gulp多次执行任务
- 25. OnPaintBackground多次执行C#?
- 26. DataContext被执行多次
- 27. 防止多次执行
- 28. JBPM多次执行任务
- 29. PlayFramework作业多次执行?
- 30. 使配方执行两次
请参阅[并发编程指南:同时执行循环迭代](https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW23)。被警告你(a)必须将你的更新同步到最终字典中,以确保它是以线程安全的方式完成的;和(b)并发计算的性能增益将被多个线程上协调活动的开销抵消,有时会完全消除您可能希望获得的任何性能增益。 – Rob
在这里添加你的代码以获得更好的帮助 –
底线,使用'dispatch_apply',但要确保你已经有足够的每个线程来证明'dispatch_apply'的开销和结果的同步。 – Rob