2012-04-24 14 views
1

配列のオブジェクトを今すぐ削除しなければならないときに、このエラーが発生します。あなたはイムを見ることができるようにCALayerArrayが列挙されている間に突然変異しました

- (NSArray *)occupantsArray 
{ 
    if (dispatch_get_current_queue() == moduleQueue) 
    { 
     return occupantsArray; 
    } 
    else 
    { 
     __block NSArray *result; 

     dispatch_sync(moduleQueue, ^{ //ON THIS LINE 
      result = [occupantsArray copy]; 
     }); 

     return [result autorelease]; 
    } 
} 

コレクション< CALayerArray:エラーが配列のaccesorあり、この方法で表示されます

を列挙しつつ0xc4f3b20>が変異しました元の配列ではなくコピーが返されないように注意しますが、それでもクラッシュします。

また、配列の要素を削除する方法はこれです。

- (void)eraseJIDFromArray:(NSString*)jid{ 

    dispatch_block_t block = ^{ 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     int i = 0; 
     for(NSString *jidAct in occupantsArray){ 
      if([jidAct isEqualToString:jid]){ 
       [occupantsArray removeObjectAtIndex:i]; 
      } 
      i++; 
     } 
     [pool drain]; 
    }; 

    if (dispatch_get_current_queue() == moduleQueue) 
     block(); 
    else 
     dispatch_async(moduleQueue, block); 



} 

配列は、200個の要素件まで持つことができるので、それらのすべてを通過するのに時間がかかることがありますが、私はキューを設定しています、私が行うことができます他に何を知りません。

アイデア?

ありがとうございました。

+0

キューが現在のキューであるかどうかをチェックしないでください。作成されたキューはターゲットキューを持つことができます。つまり、あるキューが他のキューに作業を振り向けることができます。他のキューに振る舞うことができます。 'dispatch_get_current_queue'はすべてのキューを返すことができません。あなたの仕事を常に派遣し、GCDが可能で安全であればその仕事をインラインにすることを信頼してください。 – Jesper

+0

新しいキューを作成する必要がありますか? – subharb

+0

いいえ、常にdispatch_asyncまたはdispatch_syncを呼び出して、GCDにキュー内の何かを実行させるように指示します。現在キューのスレッドにいるかどうかは関係ありません。つまり、キューのスレッドにないことを保証することができない限り、dispatch_syncを避ける必要があります。 – Jesper

答えて

4

このコード:

for(NSString *jidAct in occupantsArray){ 
    if([jidAct isEqualToString:jid]){ 
     [occupantsArray removeObjectAtIndex:i]; 
    } 
    i++; 
} 

は、おそらくあなたの問題を引き起こしています。配列の列挙中に要素を削除しないでください。これを避ける方法は、NSMutableIndexSetを使用することです。

NSMutableIndexSet *indexes = [NSMutableIndexSet set]; // assuming NSInteger i; 
for(NSString *jidAct in occupantsArray){ 
    if([jidAct isEqualToString:jid]){ 
     [indexes addIndex:i]; 
    } 
    i++; 
} 
[occupantsArray removeObjectsAtIndexes:indexes]; 
+0

ありがとう、これは完璧に動作し、スレッドの必要はありません。 – subharb

関連する問題