gpt4 book ai didi

具有重试功能的 NSURLConnection sendAsynchronousRequest

转载 作者:行者123 更新时间:2023-12-01 05:26:01 26 4
gpt4 key购买 nike

我的主 UI 线程调用 sendAsynchronousRequest NSURLConnection的方法获取数据。

[NSURLConnection sendAsynchronousRequest:[self request] 
queue:[NSOperationQueue alloc] init
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
if (error)
{
//error handler
}
else
{
//dispatch_asych to main thread to process data.
}
}];

这一切都很好。

我的问题是,我需要在错误时实现重试功能。
  • 我可以在这个街区里做,然后调用sendSynchronousRequest吗?重试,因为这是后台队列。
  • 或者分派(dispatch)到主线程并让主线程处理重试(通过调用 sendAsynchronousRequest 并重复相同的循环)。
  • 最佳答案

    您通过调用 [self request] 收到请求.如果 request是原子@property,或者是线程安全的,我想不出你不能从非主线程开始重试的任何原因。

    或者,您可以在 +sendAsynchronousRequest:queue: 之前将请求的副本放入局部变量中。称呼。如果你这样做,然后在你的完成处理程序中引用它,那么它将被隐式保留,[self request]只会被调用一次。

    一般来说,这可能不是一个很好的模式。如果服务关闭,没有其他检查,它将永远继续尝试。你可以尝试这样的事情:

    NSURLRequest* req = [self request];
    NSOperationQueue* queue = [[NSOperationQueue alloc] init];
    __block NSUInteger tries = 0;

    typedef void (^CompletionBlock)(NSURLResponse *, NSData *, NSError *);
    __block CompletionBlock completionHandler = nil;

    // Block to start the request
    dispatch_block_t enqueueBlock = ^{
    [NSURLConnection sendAsynchronousRequest:req queue:queue completionHandler:completionHandler];
    };

    completionHandler = ^(NSURLResponse *resp, NSData *data, NSError *error) {
    tries++;
    if (error)
    {
    if (tries < 3)
    {
    enqueueBlock();
    }
    else
    {
    // give up
    }
    }
    else
    {
    //dispatch_asych to main thread to process data.
    }
    };

    // Start the first request
    enqueueBlock();

    关于具有重试功能的 NSURLConnection sendAsynchronousRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13819321/

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