2012-09-13 20 views
0

可能重複:
How do I kill/suspend/close an asyncronous block in GCD?如何取消上一個GCD塊的前一個塊?

我工作的一個應用程序,並圖像處理和顯示產生的圖像。我使用UIScrollView讓用戶滾動所有圖像,因爲圖像不是標準的jpg或png,需要時間加載。我使用GCD異步加載,當完成派遣到主隊列顯示。代碼片段如下:

- (void)loadImage:(NSString *)name 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     UIImage *image = [Reader loadImage:name]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      [self displayImage:image]; 
     }); 
    }); 
} 

這在大多數情況下運行良好。但是當你滾動得太快以至於在第一個加載的圖像被顯示之前該方法可能會被調用多次。然後當你停止時,當前imageView將快速顯示多個先前的圖像,然後最後顯示當前圖像。由於內存問題很容易崩潰。

我想知道是否有辦法通知隊列取消先前的隊列,如果隊列中有新的塊(這意味着在前一個塊完成之前再次調用該方法)?或者其他更好的建議?

在此先感謝。

+0

@Monolo謝謝,我會看看 – chancyWu

+0

@Monolo他們是完全不同的,我想用我的即將停止之前發送的塊塊,這似乎更困難,我不知道如何做到這一點。 – chancyWu

+0

看看dispatch_suspend和dispatch_release方法 - 我不知道你的確切情況,所以我不能肯定地告訴我。 –

回答

0

您正在使用類方法來加載圖像,但同時從各個線程調用它們(通過塊),所以我希望你已經爲此設計了Reader。在任何情況下,我建議你做的是創建一個可變集合,並且每次向Reader發送消息以加載圖像時,首先將該名稱添加到集合中。當它返回,然後刪除名稱,但在主線程(在mainQueue或主線程上添加和刪除都完成)。

現在,當您想要停止處理一個或所有圖像時,添加一個新的'cancelLoad'方法閱讀器,併發送一個你想要它停止處理的名字的列表

+0

不錯的解決方案會嘗試一下。非常感謝。 – chancyWu