Iphone ASIHTTPRequest中请求的顺序

Iphone ASIHTTPRequest中请求的顺序,iphone,objective-c,cocoa-touch,nsurlconnection,asihttprequest,Iphone,Objective C,Cocoa Touch,Nsurlconnection,Asihttprequest,我正在使用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

我正在使用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
。我之所以在单独的方法中调用第三个请求,是因为它将被多次调用。在放置一些控制台输出之后,似乎在
request2
开始下载之前调用了
callThirdRequest
。因此,当
callThirdRequest
试图获取一些应该由
request2
下载的数据时,由于没有数据,因此无法工作

为什么呢?我如何确保只有在下载完
request2
后才调用
callThirdRequest


谢谢,这是因为request2正在异步运行。您应该在request2的request Dod finish委托方法中启动第三个请求

这是因为request2正在异步运行。您应该在request2的request Dod finish委托方法中启动第三个请求

原因是
启动同步
。异步调用将在另一个线程上运行。您需要在request2上设置委托,然后在request2完成时调用第三个请求

    // Request 2
    request2.tag = 2;
    [request2 setDelegate:self];
    [request2 startAsynchronous];

...

- (void)requestFinished:(ASIHTTPRequest *)request
{
    [self callThirdRequest];
}

原因是
启动同步
。异步调用将在另一个线程上运行。您需要在request2上设置委托,然后在request2完成时调用第三个请求

    // Request 2
    request2.tag = 2;
    [request2 setDelegate:self];
    [request2 startAsynchronous];

...

- (void)requestFinished:(ASIHTTPRequest *)request
{
    [self callThirdRequest];
}

当异步运行请求时,其余代码将继续同时运行。您的前两个请求正是这样做的。你有两个选择

您可以同步运行第二个请求。(这不是一个好主意,因为在第二个请求完成之前,你的应用程序将显示为“冻结”。此外,如果第二个请求(在你的三个请求列表中)失败,使用此方法也不会有帮助。)

更好的办法是使用委托回调方法。出于两个原因,这是更好的处理方法。首先,您可以正确处理失败的请求,也可以正确处理成功的请求。你想要这样的东西:

// Request 2
request2.tag = 2;
[request2 setDelegate:self];
[request2 startAsynchronous];



- (void)requestFinished:(ASIHTTPRequest *)request{
   if(request.tag == 2){
     [self callThirdRequest];
   }
}

确保检查委托回调中的请求,以确保它是“第二个”请求,这样就不会在错误的时间触发错误的操作。在本例中,我使用了请求的“tag”属性。如果您想将请求保留为类的属性,也可以检查它。

当异步运行请求时,其余代码将继续同时运行。您的前两个请求正是这样做的。你有两个选择

您可以同步运行第二个请求。(这不是一个好主意,因为在第二个请求完成之前,你的应用程序将显示为“冻结”。此外,如果第二个请求(在你的三个请求列表中)失败,使用此方法也不会有帮助。)

更好的办法是使用委托回调方法。出于两个原因,这是更好的处理方法。首先,您可以正确处理失败的请求,也可以正确处理成功的请求。你想要这样的东西:

// Request 2
request2.tag = 2;
[request2 setDelegate:self];
[request2 startAsynchronous];



- (void)requestFinished:(ASIHTTPRequest *)request{
   if(request.tag == 2){
     [self callThirdRequest];
   }
}

确保检查委托回调中的请求,以确保它是“第二个”请求,这样就不会在错误的时间触发错误的操作。在本例中,我使用了请求的“tag”属性。如果您想将请求保留为类的属性,也可以进行检查。

谢谢!我还有一个请求,它被多次调用。在最后一次通话中,我想设置一个窗口。如何确定最后一次调用请求的时间?谢谢!我还有一个请求,它被多次调用。在最后一次通话中,我想设置一个窗口。如何确定最后一次调用请求的时间?这正是我所做的。谢谢我的第三个请求被多次调用以下载一些数据。最后,我想打开一扇窗。我如何确定最后一个请求何时被调用?我不确定,根据数据的性质可能很容易确定。显然,您可以使用委托回调并检查
标记
是否为3,但您仍然需要知道这是最后一次调用的时间。是否最好将第三次请求设置为同步调用,然后在下载结束时设置窗口?我不确定这是否有效,因为第三个请求运行了几次。我可以事先确定第三个请求将运行多少次。因此,如何确定在
requestFinished
中设置窗口?请预先存储次数。然后,在类中保留一个计数器(甚至在委托方法中保留一个静态变量)。在委托方法中,当与第三个请求对象(第三个请求)的标记匹配的请求完成时,递增所述计数器。当计数器达到目标请求数时,调用任意代码。这正是我所做的。谢谢我的第三个请求被多次调用以下载一些数据。最后,我想打开一扇窗。我如何确定最后一个请求何时被调用?我不确定,根据数据的性质可能很容易确定。显然,您可以使用委托回调并检查
标记
是否为3,但您仍然需要知道这是最后一次调用的时间。是否最好将第三次请求设置为同步调用,然后在下载结束时设置窗口?我不确定这是否有效,因为第三个请求运行了几次。我可以事先确定第三个请求将运行多少次。因此,如何确定在
requestFinished
中设置窗口?请预先存储次数。然后,在类中保留一个计数器(甚至在委托方法中保留一个静态变量)。