我是否可以故意阻塞循环以等待异步回调完成?

时间:2009-02-21 04:23:42

标签: iphone objective-c cocoa-touch

我正在尝试在我的iPhone应用程序中批量上传照片。我有一个脚本循环浏览用户的照片,然后为每张照片调用另一个脚本进行上传。

执行上传的脚本需要回调用于触发每个用户照片的脚本来表示成功或失败。这有点奇怪,但是我需要能够在循环中获得同步调用的阻塞功能,但同时上传脚本是异步的。

代码非常复杂,所以我将尝试使用伪代码:

脚本一:

foreach (photoNeedsUpload in users photos)

       upload the photo via Upload Script

callback hook: successOrFailureUploading (called back by the Upload Script)

上传脚本:

    1. Do the upload and then wait for NSURLRequest callbacks: 

    connectionDidFinishLoading, didFailWithError, etc., etc.

    2. Upon getting called back, in turn:
call back Script One appropriately with success/failure signal

我的问题是我想要进行异步回调,以便检查上传状态,但我确实需要阻止每张照片并等待它上传。

有一种简单的方法可以做这样的事吗?我应该让线程进入睡眠状态,还是应该让http调用同步?如果是这样,如何检查成功?

我承认我没有做我的设计作业,而且开始觉得我为自己创造了一个循环问题!

2 个答案:

答案 0 :(得分:2)

嗯,是的,确定你可以。只需向调用者添加一个标志,比如一个信号量;让它等在那面旗帜上。

清除回调中的标志。热潮,你在那里。

问题是:为什么?为什么要解决所有麻烦;而是只是同步启动进程。那你就不需要回调了。

两种情况下的问题是,当你开始等待时,你的进程显然会挂起 - 没有UI事件,没有提升 - 降低,所有这些东西。这让我感到很不可取。

你确定你不会只是让回调设置一个标志来告诉你工作已经完成,并回过头来看看它?

您也可以查看异步完成令牌模式。

答案 1 :(得分:2)

我需要做类似的事情。我想要一个同步下载,但需要一些异步下载的方法(特别是处理授权)。

我这样做了

-(BOOL)getDataSynchronouslyFromAddress:(NSString*)address
{
    if (downloadRunning)
    {
        return NO;
    }

    downloadRunning=YES;
    downloadSucceeded=NO;

    NSURLConnection *connection=[self startConnectionWithAddress:address];
    if (!connection)
    {
        NSLog(@"no connection");
        downloadRunning=NO;
    }

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    while (downloadRunning && [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

    return downloadSucceeded;
}

下载完成后,我只需适当设置downloadSucceeded,并将downloadRunning设置为NO。