4

我有我的主 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.
            } 
        }];

这一切都很好。

我的问题是,我需要在错误时实现重试功能。

  1. 我可以在此块中执行此操作并调用sendSynchronousRequest重试,因为这是后台队列。
  2. 或者调度到主线程并让主线程处理重试(通过调用sendAsynchronousRequest并重复相同的循环)。
4

1 回答 1

1

您正在通过调用来获取请求[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();
于 2013-02-10T18:09:31.123 回答