Best way to remove from NSMutableArray while iterating?によれば、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];
}
のようなコードを持っている場合、私はsendFeedback方法、時間の周期ごとに実行するためにNSThreadを作成するために、NSRunLoopを使用しています何。私がAPIにデータを送信する方法は、非同期メソッド(リクエストごとにバックグラウンドスレッドを作成する)を使用することです。フィードバックが送信されると、NSRunnerが次の期間にこのメソッドを実行して重複を避けるために、データ提出
非同期を使用すると、ループ(メインスレッド)はサーバーからの応答を待たずに実行を継続します。場合によっては(ほとんどの場合)、各要求のサーバーからのすべての応答が戻ってくる前に、ループは実行を終了します。そのようにした場合、完了ブロックのコードが送信されたデータになりますremoveObjectsInArrayが、私はその問題を回避するには、いくつかの方法があることをかなり確信してself.feedbackQueue
に残った後に実行されます。しかし、考えられる唯一の方法は、同期メソッドを代わりに使用して、removeObjectsInArrayがすべての要求の応答が返ってくる前に実行されないようにすることです(成功または失敗のいずれか)。しかし、私がそうするなら、それはインターネット接続がより長い期間利用可能でなければならないということです。 sendFeedbackのスレッドに必要な時間が長くなります。それが新しく作成されたNSThreadによって実行されても、アプリケーションが応答しなくても、リソースは必要になります。
私は上記以外の方法がありますか?どんな提案も大歓迎です。
ありがとうございます。
これは興味深いことですが、私はObjective-CとiOS Devの新機能です。だから、今日の必読リストに「ディスパッチ」を追加してください。ありがとう:) –
@ Tar_Tw45ええ、グランドセントラルディスパッチは、多くのもののための超便利なAPIです。ドキュメントはhttps://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/doc/uid/TP40008079にあり、関連ガイドはかなり良いですあまりにも。 –