2009-02-21 50 views
0

我正在尝试在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

嗯,是的,当然,你可以可以。给调用者添加一个标志,比如一个信号量,让它在那面旗帜上等待。

清除回调中的标志。轰隆,你在。

问题是:为什么?为什么要去所有的麻烦;相反,只需同步启动进程即可。那么你不需要回调。

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

你确定你不想让回调设置一个标志来告诉你工作已经完成,然后回过头来看看它吗?

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

+0

与您的第一个建议,这对我来说工作正常,只是调用:[NSURLConnection sendSynchronousRequest:req returningResponse:&响应错误:&错误]; 感谢查理的想法! – Rob 2009-02-25 17:06:21

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。