2009-02-21 49 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。