2017-05-06 66 views
0

我有一个数组 - 说wordsArray其中wordArray的每个对象是另一个数组 - 说wordList。使用for循环,我选取每个对象(wordList)并调用另一个类的方法-say wordScore,它将返回带有单词和分数的NSDictionary。不是一个一个地为每个对象调用wordScore,有没有办法让它们平行运行?每个wordList的wordScore应该并行执行,并在执行结束时,每个wordScore的所有NSDictionaries应合并成一个单一的NSDictionary多次并行执行类的执行方法

+0

请参阅[并发编程指南:同时执行循环迭代](https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW23)。被警告你(a)必须将你的更新同步到最终字典中,以确保它是以线程安全的方式完成的;和(b)并发计算的性能增益将被多个线程上协调活动的开销抵消,有时会完全消除您可能希望获得的任何性能增益。 – Rob

+0

在这里添加你的代码以获得更好的帮助 –

+0

底线,使用'dispatch_apply',但要确保你已经有足够的每个线程来证明'dispatch_apply'的开销和结果的同步。 – Rob

回答

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

这个工作很棒! –