Согласно 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];
}
Я использую NSRunLoop создать NSThread выполнить метод sendFeedback каждый период времени. Способ, которым я отправлял данные в API, - это использовать метод Asynchronous (который создаст фоновый поток для каждого запроса). После отправки обратной связи его необходимо удалить до того, как NSRunner выполнит этот метод в следующий период, чтобы избежать дублирования представления данных.
При использовании асинхронного цикла (основной поток) будет продолжать работать, не дожидаясь ответа от сервера. В некоторых случаях (возможно, в большинстве случаев) цикл завершается до того, как будет возвращен весь ответ от сервера каждого запроса. Если это так, код блока завершающего будет выполняться после того, как removeObjectsInArray, что приведет к отправленным данным остается в self.feedbackQueue
Я уверен, что есть несколько способов избежать этой проблемы. Но единственное, что я могу представить, это использовать вместо этого метод Synchronous, так что removeObjectsInArray не будет выполняться до того, как все ответы запроса вернутся (либо успех, либо неудача). Но если я это сделаю, значит, интернет-соединение должно быть доступно на более длительный период. Время, необходимое для потока sendFeedback, будет больше. Даже он будет запускаться только что созданным NSThread, который не заставит приложение не отвечать, в любом случае понадобятся ресурсы.
Итак, есть ли какой-либо другой способ помимо того, что я упомянул выше? Любое предложение приветствуется.
спасибо.
Это интересно, я новичок в Objective-C и iOS Dev. Итак, добавьте «рассылку» в список сегодняшнего обязательного чтения. Спасибо:) –
@ Tar_Tw45 Да, Grand Central Dispatch - супер полезный API для многих вещей. Документация находится здесь: https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/doc/uid/TP40008079 и связанный с ней справочник довольно хорош слишком. –