Jay*_*tra 6 synchronization nsoperation nsoperationqueue ios
我已经在应用程序中成功实现了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
Run Code Online (Sandbox Code Playgroud)
现在,对于该队列,我一次添加所有1000个操作.我添加如下操作.
Operations *operation = [[Operations alloc]init];
[downloadQueue addOperation:operation];
Run Code Online (Sandbox Code Playgroud)
现在时间间隔为60的情况 [request setTimeoutInterval:60]
因此,如果在60秒后如果1000次操作中的300次操作完成,则认为其他700次操作正在抛出请求超时错误.
那么在这种情况下我该怎么办呢.
我可以恢复失败的操作吗?或者我应该再次进行操作并将其添加到队列中.
有没有比这个更好的机制?
我最初的倾向是,是的,只需为超时请求创建新操作并将它们扔回队列中。它只是感觉更简单,因为您已经有了为您的请求添加这些操作的逻辑。然而:
小心不要陷入无限循环。如果其中只有一个由于某种原因无限期失败,您的队列将继续堵塞。我会保留失败计数,以便您知道在有限次数的尝试后停止重试请求。
如果您知道大量的数据总是会失败,请考虑以某种方式对它们进行批处理。一种选择是依赖链。例如。您可以尝试添加 200 个操作,一个“等待”NSOperation,下一个 200 个,另一个“等待”NSOperation,另一个“等待”操作,等等。使第一个等待操作依赖于前 200 个请求。然后使接下来的 200 个取决于第一个等待操作,依此类推:
基本上类似于 2,但不是“等待”操作,而是“完成”操作。假设您有一个包含 1000 个请求的数组要发送:将 200 个请求放入队列中,然后是一个依赖于这 200 个请求的“完成”操作。当“完成”操作运行时(根据定义,在这 200 个请求完成之后),它可以然后从数组中取出接下来的 200 个并将它们扔进去(加上一个新的“完成”操作)。
(甚至可以考虑让等待/完成操作“暂停”几秒钟,让服务器喘口气)
换句话说,对于 #2 和 #3,我的意思是“立即爆破 200 个,等待,然后爆破下一个 200 个,等待,等等”。(200 对我来说是任意的,你比我更清楚什么数字最适合你的情况)
归档时间: |
|
查看次数: |
530 次 |
最近记录: |