2017-05-06 5 views
0

私は配列を持っています - wordsArrayの各オブジェクトは別の配列 - 言葉リストを言うwordsArrayを持っています。 forループを使用して、各オブジェクト(wordList)を選択し、単語とスコアを持つNSDictionaryを返す別のクラスのメソッド-say wordScoreを呼び出します。それぞれのオブジェクトに対してwordScoreを1つずつ呼び出すのではなく、それらを並列に実行する方法はありますか?各wordListのwordScoreは並列に実行する必要があり、実行の終了時には、各wordScoreのすべてのNSDictionariesを1つのNSDictionaryにマージする必要があります。クラスの複数回の並列実行メソッド

+0

[同時処理プログラミングガイド:ループ反復を同時に実行](https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid)を参照してください。/TP40008091-CH102-SW23)。スレッドセーフな方法で更新が完了したことを確認するには、更新プログラムを最終的な辞書に同期させる必要があります。 (b)並行計算のパフォーマンス向上は、複数スレッドのアクティビティを調整するオーバーヘッドによって相殺され、場合によっては、期待していたパフォーマンスの向上を完全になくすことがあります。 – Rob

+0

あなたのコードをここに追加して助けてください –

+0

結論としては、 'dispatch_apply'を使いますが、' dispatch_apply'のオーバーヘッドと結果の同期を正当化するために各スレッドで十分であることを確認してください。 – Rob

答えて

1

私はwordsArrayの同時列挙をやる、のは、私はこのクラスここから

@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 

のような愚かな何かを持っているとしましょう。私は、同時の反復のそれぞれに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

これは素晴らしい動作です! –

関連する問題