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

问题描述

| 我正在尝试实现一个排队系统,用于将内容发送到iPhone应用程序中的Web服务。 该代码有效,但是如果由于网络错误等导致连接失败,该请求将被丢弃。 我希望我的应用重新排队该请求,而不只是删除它,但是我不知道该怎么做?我尝试这样做:
(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\'
在这里做错了什么?     

解决方法

        我也有这样的设置。我有一个后台线程,每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]];
       }

    }
现在,您将在设备离线时开始排队请求。一旦该后台线程发现网络连接,队列就开始处理,一切都通过。 当然,还需要进行更多的错误检查,但是希望这将是一个很好的起点。     ,        我遇到了同样的问题。您可以简单地复制请求:
[[self queue] addOperation:[request copy]];
不确定内存管理对我在这里所做的事情表示什么...     ,        只是一个猜测:也许操作不能多次排队,而必须重新创建?