如何解决如何使用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]];
不确定内存管理对我在这里所做的事情表示什么...
, 只是一个猜测:也许操作不能多次排队,而必须重新创建?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。