根据迭代时从 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
我很确定有几种方法可以避免这个问题。但我能想到的唯一方法是使用同步方法,以便在所有请求的响应返回(成功或失败)之前不会执行removeObjectsInArray 。但如果我这样做,则意味着互联网连接必须可用更长的时间。sendFeedback 线程所需的时间会更长。即使它将由新创建的 NSThread 运行,这不会导致应用程序不响应,但无论如何都需要资源。
那么,除了我上面提到的方法之外,还有其他方法吗?欢迎任何建议。
谢谢你。