跟踪ASIHTTPRequest的多个实例的最佳方法是什么?

时间:2011-09-10 00:35:43

标签: iphone objective-c ios asihttprequest nsoperationqueue

我有一些代码可以发送多个ASIHTTPRequests来上传和下载视图控制器中的数据。当视图控制器被dealloc'd时,它应该通过将委托设置为nil来清理所有未完成的请求。

- (void)viewDidLoad
{
        // send multiple requests
        [self sendRequest:someURL];
        [self sendRequest:someURL];
        [self sendRequest:someURL];
        [self sendRequest:someURL];
}

- (void)sendRequest:(NSString*)url
{
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setDelegate:self]; 

        ASINetworkQueue *requestQueue = [ASINetworkQueue queue];
        [requestQueue setMaxConcurrentOperationCount:2];
        [requestQueue setDelegate:self];
        [requestQueue addOperation:request];
        [requestQueue go];
}

- (void)dealloc
{
    NSLog(@"cancel all operations");
    for (ASIHTTPRequest *req in ASIHTTPRequest.sharedQueue.operations)
    {
        [req cancel];
        [req setDelegate:nil];
    }

    [super dealloc];
}

但是,如果我在所有操作完成之前弹出这个视图控制器,我会在ASIHTTPRequest.m中收到一条“发送给deallocated instance的消息”,抱怨代表在下面的代码中消失了。

/* ALWAYS CALLED ON MAIN THREAD! */
- (void)reportFailure
{
    ***crash here --> if (delegate && [delegate respondsToSelector:didFailSelector]) {
        [delegate performSelector:didFailSelector withObject:self];
    }
    if (queue && [queue respondsToSelector:@selector(requestFailed:)]) {
        [queue performSelector:@selector(requestFailed:) withObject:self];
    }
    #if NS_BLOCKS_AVAILABLE
    if(failureBlock){
        failureBlock();
    }
    #endif
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您正在围绕此行代码为每个请求创建一个新队列:

ASINetworkQueue *requestQueue = [ASINetworkQueue queue];

所以这里的循环不会循环遍历请求,因为它循环遍历sharedQueue,而不是你创建的新的:

for (ASIHTTPRequest *req in ASIHTTPRequest.sharedQueue.operations)

如果您在未明确设置其他队列的情况下使用[request startAynchronous],则只会将请求添加到sharedQueue。

答案 1 :(得分:2)

我可能遗漏了一些内容,但我认为等到dealloc为时已晚,您想取消viewWillDisappearviewDidUnload上的操作