我爲iPhone應用程序的UIImageView類設置了Objective-C類別。該類別的任務是幫助加載基於URL的圖像與內存/磁盤緩存異步。NSOperation + Objective-C分類=糟糕的想法?
現在,在UIImageView + Cache.m中,我可以訪問NSOperationQueue,因此我可以啓動加載線程。我創建了一個NSOperation衍生對象,使用圖像URL和目標UIImageView進行初始化,並在操作完成後在目標上執行一個選擇器。在選擇器方法中,我們設置了我們新加載的圖像(或者,如果找不到,我們設置一個替代佔位符圖像),我們就完成了!
這工作正常,直到一個UIImageView碰巧被刪除之前 NSOperation完成。例如,我在UI中有一個上一個/下一個分段控件,這會導致這些UIImageView被刪除並重新添加(它們是在應用程序中查看的較大「項目」的一部分),因此很容易點按這些迅速連續。
因此,如果您決定開始在所有圖像加載之前開始竊聽 - KABLAM!不愉快的線程有一個無效的對象,並不知道它。 :(
我能找到幫助減輕這種最接近的事是的NSOperation的取消和isCancelled方法,但你不能跟蹤其操作對象的範疇內取消,因爲 - 如果我理解正確 - 分類不能添加的ivars對象
也許這意味着分類是不是一個好主意在這裏(抱怨道:「但我liiiiike分類Waaah!」)
周密讚賞
!?!
該類爲UIImageView添加了兩種方法:loadWithCachedImageForURL :(NSURL *)url和didFinishLoadingImageWithResult:(NSDictionary *)結果。還有一個名爲ImageLoadingOperation的NSOperation子類,它在啓動操作時由loadWithCachedImageForURL使用。(該隊列是在用於少數常用對象的單例類中的其他地方定義的。) 同時,保留想法聽起來可能有用!我沒有想到那個。我會回報 - 謝謝! – 2009-07-09 12:52:44
使用保留幫助!謝謝! – 2009-07-09 12:57:07
那麼,保留/釋放。 ;) 至於檢查可見性,操作不知道目標是什麼(UIImageView等)。現在,我想我應該檢查它是什麼類型的對象,但該操作最初設計用於處理任何對象,而不僅僅是圖像視圖。目前,我將繼續並加載映像,並在init中進行保留,並在dealloc中進行釋放(對於NSOperation)。合理? – 2009-07-09 13:00:01