gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:48:43 26 4
gpt4 key购买 nike

我已经在应用程序中成功实现了 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 次操作将抛出请求超时错误。

那么在这种情况下我该怎么办。

我可以恢复失败的操作吗?或者我应该再次进行操作并将其添加到队列中。

还有比这个更好的机制吗?

最佳答案

我最初的想法是,是的,只是为超时的请求创建新的操作,然后将它们扔回队列中。它只是感觉更简单,因为您已经有了为您的请求添加这些操作的逻辑。然而:

  1. 注意不要陷入无限循环。如果其中一个由于某种原因无限期地失败,您的队列将继续运转。我会保留一个失败计数,以便您知道在有限次数的尝试后停止重试请求。

  2. 如果您知道大量数据总是会失败,请考虑以某种方式对它们进行批处理。一种选择是依赖链。例如。您可以尝试添加 200 个操作,一个“等待”NSOperation,接下来的 200 个,另一个“等待”NSOperation,另一个“等待”操作等。让第一个等待操作依赖于前 200 个请求。然后让接下来的 200 个依赖于第一个等待操作,依此类推:

    • [第一批:前 200 个请求]
    • [等待 1:WAITING所有批处理 1 的操作]
    • [第2批:下200个,每个等待wait 1]
    • [等待 2:WAITING所有批处理 2 的操作]
    • [第 3 批:下 200 个,每个等待 wait 2]
    • 等等
  3. 基本上类似于 2,但不是“等待”操作,而是“完成”操作。假设您有一个包含 1000 个请求的数组要发送:将 200 个放入队列,然后是依赖于这 200 个的“完成”操作。当“完成”操作运行时(根据定义,在这 200 个完成之后),它可以然后从数组中取出下一个 200 个并将它们扔进去(加上一个新的“完成”操作)。

(甚至可以考虑让等待/完成操作“暂停”几秒钟,让服务器喘口气)

换句话说,对于 #2 和 #3,我是说“一次爆破 200,等待,然后再爆破下一个 200,等等”。 (200 对我来说是任意的,你比我更清楚什么是最适合你的情况)

关于ios - 如何在 iOS 中恢复超时操作 NSOperationQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38052896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com