我有一些代码可以发送多个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
}
我该如何解决这个问题?
答案 0 :(得分:4)
您正在围绕此行代码为每个请求创建一个新队列:
ASINetworkQueue *requestQueue = [ASINetworkQueue queue];
所以这里的循环不会循环遍历请求,因为它循环遍历sharedQueue,而不是你创建的新的:
for (ASIHTTPRequest *req in ASIHTTPRequest.sharedQueue.operations)
如果您在未明确设置其他队列的情况下使用[request startAynchronous]
,则只会将请求添加到sharedQueue。
答案 1 :(得分:2)
我可能遗漏了一些内容,但我认为等到dealloc
为时已晚,您想取消viewWillDisappear
或viewDidUnload
上的操作