配列のオブジェクトを今すぐ削除しなければならないときに、このエラーが発生します。あなたはイムを見ることができるように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個の要素件まで持つことができるので、それらのすべてを通過するのに時間がかかることがありますが、私はキューを設定しています、私が行うことができます他に何を知りません。
アイデア?
ありがとうございました。
キューが現在のキューであるかどうかをチェックしないでください。作成されたキューはターゲットキューを持つことができます。つまり、あるキューが他のキューに作業を振り向けることができます。他のキューに振る舞うことができます。 'dispatch_get_current_queue'はすべてのキューを返すことができません。あなたの仕事を常に派遣し、GCDが可能で安全であればその仕事をインラインにすることを信頼してください。 – Jesper
新しいキューを作成する必要がありますか? – subharb
いいえ、常にdispatch_asyncまたはdispatch_syncを呼び出して、GCDにキュー内の何かを実行させるように指示します。現在キューのスレッドにいるかどうかは関係ありません。つまり、キューのスレッドにないことを保証することができない限り、dispatch_syncを避ける必要があります。 – Jesper