我有一个操作队列,可能有1000个NSOperations,如下所示.
@interface Operations : NSOperation @end @implementation Operations - (void)main { NSURL *url = [NSURL URLWithString:@"Your URL Here"]; NSString *contentType = @"application/json"; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSError *err = nil; NSData *body = [NSJSONSerialization dataWithJSONObject:postVars options:NSJSONWritingPrettyPrinted error:&err]; [request setHTTPBody:body]; [request addValue:[NSString stringWithFormat:@"%lu",(unsigned long)body.length] forHTTPHeaderField: @"Content-Length"]; [request setTimeoutInterval:60]; NSHTTPURLResponse *response = nil; NSError *error = nil; NSData *resData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; } @end
现在,对于该队列,我一次添加所有1000个操作.
我添加如下操作.
Operations *operation = [[Operations alloc]init]; [downloadQueue addOperation:operation];
现在时间间隔是60,因为[request setTimeoutInterval:60]
因此,如果在60秒后如果1000次操作中的300次操作完成,则认为其他700次操作正在抛出请求超时错误.
那么在这种情况下我该怎么办呢.
我可以恢复失败的操作吗?或者我应该再次进行操作并将其添加到队列中.
有没有比这个更好的机制?
解决方法
>小心不要陷入无限循环.如果其中任何一个因任何原因而无限期失败,那么你的队列将会继续发挥作用.我会保留失败计数,以便您知道在经过一些有限的尝试后停止重试请求.
>如果您知道大量数据总是会失败,请考虑以某种方式对它们进行批处理.一种选择是依赖链.例如.您可以尝试添加200个操作,“等待”NSOperation,下一个200,另一个“等待”NSOperation,另一个“等待”操作等.使第一个等待操作依赖于前200个请求.然后使下一个200依赖于第一个等待操作,依此类推:
> [批次1:前200个请求]
> [等待1:等待所有批次1的操作]
> [批次2:下一个200,每个等待等待1]
> [等待2:等待所有批次2的操作]
> [批次3:下一个200,每个等待等待2]
>等
>基本上就像2而不是“等待”操作,有一个“完成”操作.假设你有一个1000个请求发送的数组:将200投入队列,然后是“完成”操作,这取决于那些200.当“完成”操作运行时(根据定义,在完成200个之后),它可以然后从阵列中拉出下一个200并将它们扔进去(加上一个新的“完成”操作).
(甚至可以考虑让等待/完成操作“暂停”几秒钟以使服务器休息一下)
换句话说,对于#2和#3,我说的是“立即爆炸200,等待,然后爆炸下一个200,等待等等” (对我而言,200是任意的,你比我更了解你的情况最佳数字)