2013-10-30 37 views
0

還有就是計劃的一部分:不要在iOS的iOS中7工作dispatch_async像6

dispatch_sync (dispatch_get_main_queue(),^{ 
    [startBtn setTitle: @ "Loading ..." forState: UIControlStateNormal]; 
    [self loadImages];// loading images - AssesLibrary 
}); 

[self makeCollage]; 
NSLog (@ "Albums found:% lu", (unsigned long) [assetGroups count]); 

從塊dispatch_sync程序出來,我需要開始執行[self loadImages]功能(填數據陣列),然後執行​​。 如果沒有dispatch_sync - 那麼只是​​開始填充沒有進一步處理數組,並給出錯誤。

建議如何成爲

+4

[iOS的](http://en.wikipedia.org/wiki/iOS)是不** ** [IOS](http://en.wikipedia.org/維基/ Cisco_IOS)! – 2013-10-30 06:00:23

+3

你在主線程上調用'dispatch_sync'嗎?如果是的話,你正在造成僵局。 –

回答

4

加入:

dispatch_queue_t currentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(currentQueue, ^{ 

    __block UIImage *image=nil; 
    dispatch_sync(currentQueue, ^{ 

     //download the image here 
     image = [self loadImages]; 

    }); 

dispatch_sync(dispatch_get_main_queue(), ^{ 

     //handle the image to the user here on the main queue 
     if (image != nil){ 
      [self makeCollage]; 
     } else 
     { 
      NSLog(@"Image isn't downloaded. Nothing to do."); 
     } 

    }); 
}); 
0

試試這個:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL), ^{ 
    // Do your stuff 
}); 
+0

對不起,如果我評論,這是不完全正確的。您請求的全局隊列在後臺線程上運行,並且大部分UIKit都不是線程安全的。調度異步是正確的,但塊應該在主隊列上運行。 – Andrea

0

由於加布裏埃爾說你是導致死鎖。你有兩個選擇:

  1. 創建一個新的同步隊列,但似乎你在塊中使用UIKit。 UIKit中的大多數不是線程安全特別是對於那些對使用dispatch_sync顯示屏上影響
  2. 取而代之的一部分,使用dispatch_async主隊列

如果你想在後臺線程發送工作你應該組織你的邏輯不同。

相關問題