我正在使用ASIHTTPRequest下载一些数据。
我在方法中有以下内容:
// Request 1
request1.tag = 1;
[request1 setDelegate:self];
[request startAsynchronous];
// Request 2
request2.tag = 2;
[request2 setDelegate:self];
[request2 startAsynchronous];
// Call third request method
[self callThirdRequest];
现在从callThirdRequest
开始,我抓住了从request2
下载的一些数据,在那里,我正在调用startAsynchronous
。我在一个单独的方法中调用第三个请求的原因是因为它将被多次调用。在放置一些控制台输出之后,似乎在callThirdRequest
开始下载之前调用了request2
。因此,当callThirdRequest
尝试抓取本应由request2
下载的某些数据时,由于没有数据,它无效。
为什么?如何确保仅在callThirdRequest
下载时调用request2
?
谢谢,
答案 0 :(得分:2)
当异步运行请求时,其余代码将继续同时运行。你的前两个请求正是这样做的。你有两个选择。
您可以同步运行第二个请求。 (不是一个好主意,因为在第二个请求完成之前,您的应用程序将显示为“冻结”。此外,如果第三个请求在您的三个列表中失败,则使用此方法将无法帮助您。)
更好的想法是使用委托回调方法。这是解决这个问题的更好方法,原因有两个。首先,您可以正确处理失败的请求,并且您可以正确处理成功的请求。 Yu想要这样的东西:
// Request 2
request2.tag = 2;
[request2 setDelegate:self];
[request2 startAsynchronous];
- (void)requestFinished:(ASIHTTPRequest *)request{
if(request.tag == 2){
[self callThirdRequest];
}
}
确保在委托回调中检查请求,以确保它是“第二个”,这样您就不会在错误的时间触发错误的操作。在这种情况下,我使用了请求的“tag”属性。如果您将该请求保留为您班级的财产,您也可以检查该项请求。
答案 1 :(得分:1)
这是因为request2正在异步运行。您应该在request2的request-did-finish-delegate-method中启动第3个请求!
答案 2 :(得分:1)
原因是startAsynchronous
。异步调用将在另一个线程上运行。您需要在request2上设置委托,然后在request2完成时调用第三个请求。
// Request 2
request2.tag = 2;
[request2 setDelegate:self];
[request2 startAsynchronous];
...
- (void)requestFinished:(ASIHTTPRequest *)request
{
[self callThirdRequest];
}