我正在尝试使用ASIHTTPRequest执行异步请求,但在请求完成时收到通知时会遇到一些问题。
-(void)doDownload{
NSURL *url = [NSURL URLWithString:@"http://www.someurl.com/?"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"someValue" forKey:@"someField"];
[request setRequestMethod:@"POST"];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestFinished)];
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];
}
永远不会调用requestFinished。我在ASIHTTPRequest.m中遇到异常,-handleStreamCompleted:
if (fileError) {
[self failWithError:fileError];
} else {
[self requestFinished]; <----- this call fails
}
任何线索?
答案 0 :(得分:7)
在请求完成后,您确定实现- (void)requestFinished:(ASIHTTPRequest *)request
的类仍然存在吗?在我看来,这个课程得到了太早的解除分配。请注意,delegate
属性不会保留其内容。
您可以将[self retain]
添加到doDownload
,将[self release]
添加到- (void)requestFinished:(ASIHTTPRequest *)request
,但要确保(!)[self release]
也不会被调用经常。如果请求永远不会完成,这也可能是内存泄漏。最好将你的班级留在其他地方。
您也可以尝试调试,NSZombieEnabled
设置为YES
以查找错误。
答案 1 :(得分:4)
您的代码的下一行似乎是错误的。
[request setDidFinishSelector:@selector(requestFinished)];
requestFinished 方法有一个参数(ASIHTTPRequest *) 因此,当您按照以下方式设置选择器时,应添加“:”。
[request setDidFinishSelector:@selector(requestFinished:)];
答案 2 :(得分:0)
[request responseString];
在此次通话前检查请求的retainCount。可能它等于零:)如果那样 - 你不应该忘记在 doDownload 方法中创建它时保留它。