如何在iOS中恢复NSOperationQueue的超时操作?

我已经在应用程序中成功实现了NSOperationQueue.

我有一个操作队列,可能有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是任意的,你比我更了解你的情况最佳数字)

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...