如何使用ASIHTTP重新发送/重新排队失败的请求?

时间:2011-06-01 08:11:53

标签: ios asihttprequest

我正在尝试实施一个排队系统,用于将内容发送到iphone应用中的网络服务。 代码有效,但如果连接由于网络错误等而失败,则请求被丢弃。

我希望我的应用程序重新排队该请求,而不是仅删除它,但我无法找到方法来执行此操作?我试过这样做:

(void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
NSLog(@"Error: %@",error);

//Re-queue the request
[[self queue] addOperation:request];
}

但这只是给我一个错误说:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***      -[ASINetworkQueue addOperation:]: operation is finished and cannot be enqueued'

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

我也有这样的设置。我有一个后台线程,每30秒左右轮询一次我的服务器。如果它无法连接,则将“isOnline”设置为false。我的所有请求都会检查是否确保有网络连接,如果任何请求无法到达服务器,则认为网络连接已丢失。

// Create operation...
[networkQueue addOperation:theOperation];
if( isOnline == YES )
    [networkQueue go];
else:
    [displayAlert message:@"The operation is waiting for a connection"];

当我确定连接回来时,我的后台线程会这样做:

-(void)setIsOnline:(BOOL)val {
    if( isOnline == NO && val == YES ) {
        [networkQueue go];
    }

    isOnline = val;
 }

困难的部分是requestDidFail方法,您必须重新创建队列,否则您将丢失首次发现错误网络连接的操作。这就是我的方法:

-(void)requestDidFail:(ASIHTTPRequest*)aRequest {
       // If we find that the network is down, recreate the queue and
       // add our operation to it in suspended mode.
       if( [aRequest.error code] == ASIConnectionFailureErrorType ) {
           isOnline = NO;
           [networkQueue setSuspended:YES];
           [networkQueue cancelAllOperations];
           self.networkQueue = nil;

           ASINetworkQueue *aQueue = [[ASINetworkQueue alloc] init];
           self.networkQueue = aQueue;
           [networkQueue setDelegate:self];
           [aQueue release];
       }

       // Don't add any cancelled requests back into the queue
       if( [aRequest.error code] != ASIRequestCancelledErrorType ) {
           [networkQueue addOperation:[aRequest copy]];
       }

    }

现在,您将在设备离线时开始排队请求。一旦后台线程看到网络连接,队列就会开始处理,一切都会通过。

当然需要更多的错误检查,但希望这将是一个很好的起点。

答案 1 :(得分:2)

我遇到了同样的问题。您只需复制请求即可:

[[self queue] addOperation:[request copy]];

不确定内存管理对我在这里做什么说了什么......

答案 2 :(得分:0)

只是一个猜测:也许操作不能多次排队,必须重新创建?

相关问题