反復中にNSMutableArrayから削除する最良の方法によると? はい、反復中に NSMutableArray からオブジェクトを削除することはできません。
しかし、次のようなコードがある場合はどうなりますか
- (void)sendFeedback {
NSMutableArray *sentFeedback = [NSMutableArray array];
for (NSMutableDictionary *feedback in self.feedbackQueue){
NSURL *url = [NSURL URLWithString:@"someApiUrl"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:[feedback objectForKey:@"data"] forKey:@"data"];
[request setCompletionBlock:^{
[sentFeedback addObject:feedback];
}];
[request startAsynchronous];
}
[self.feedbackQueue removeObjectsInArray:sentFeedback];
}
NSRunLoop を使用して NSThread を作成し、一定期間ごとに sendFeedback メソッドを実行しています。APIにデータを送信する方法は、非同期メソッドを使用することです(リクエストごとにバックグラウンドスレッドを作成します)フィードバックが送信されたら、NSRunnerが次の期間にこのメソッドを実行する前に削除する必要があります。 .
非同期を使用すると、サーバーからの応答を待たずにループ (メイン スレッド) が実行され続けます。場合によっては (おそらくほとんどの場合)、各要求のサーバーからのすべての応答が返される前に、ループの実行が終了します。その場合、 removeObjectsInArrayの後に完了ブロックのコードが実行され、送信されたデータが self.feedbackQueue に残ることになります。
その問題を回避する方法はいくつかあると確信しています。しかし、私が考えることができる唯一の方法は、代わりにSynchronousメソッドを使用して、すべてのリクエストの応答が返される前にremoveObjectsInArrayが実行されないようにすることです (成功または失敗のいずれか)。しかし、そうすると、インターネット接続を長期間利用できる必要があります。sendFeedback のスレッドに必要な時間が長くなります。新しく作成された NSThread によって実行されても、アプリが応答しなくなることはありませんが、とにかくリソースが必要になります。
では、上記の方法以外に何か方法はありますか?どんな提案でも大歓迎です。
ありがとうございました。