2009-07-09 31 views
1

我爲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!」

周密讚賞

!?!

回答

1

我可能不會在這種情況下使用一個類別。類別是有用的,但通常是不必要的。如果你有一個很好的理由,我只會使用一個類別。你究竟把什麼放在類別中?

我想你可以在NSOperation子類中實現整個事情,這將是最好的解決方案。在圖像視圖中放置一個保留,以便在下載圖像之前不會取消分配,如果視圖不再可見,則取消下載。如果這是不可能的,那麼繼承UIImageView而不是使用類別。

+0

該類爲UIImageView添加了兩種方法:loadWithCachedImageForURL :(NSURL *)url和didFinishLoadingImageWithResult:(NSDictionary *)結果。還有一個名爲ImageLoadingOperation的NSOperation子類,它在啓動操作時由loadWithCachedImageForURL使用。(該隊列是在用於少數常用對象的單例類中的其他地方定義的。) 同時,保留想法聽起來可能有用!我沒有想到那個。我會回報 - 謝謝! – 2009-07-09 12:52:44

+0

使用保留幫助!謝謝! – 2009-07-09 12:57:07

+0

那麼,保留/釋放。 ;) 至於檢查可見性,操作不知道目標是什麼(UIImageView等)。現在,我想我應該檢查它是什麼類型的對象,但該操作最初設計用於處理任何對象,而不僅僅是圖像視圖。目前,我將繼續並加載映像,並在init中進行保留,並在dealloc中進行釋放(對於NSOperation)。合理? – 2009-07-09 13:00:01

0

我會說在將它移入你自己的UIImageView子類中沒有什麼壞處。當然,你可能喜歡類別 - 但是如果他們不做這項工作,那麼爲什麼猶豫轉向一個設計呢?

+1

我不是故意暗示我會猶豫。我只是想知道這是否是一個好主意,總體來說,設計模式明智。 – 2009-07-09 12:47:33

+0

關於使用子類的觀點,下面是我剛發現的一個例子!還沒有嘗試過,但想分享給那些在家裏玩的人: http://www.markj.net/iphone-asynchronous-table-image/ – 2009-07-09 15:03:51

0

你是否保留NSOperation的UIImageView?否則imageView可能會在NSOperation完成之前釋放,導致kablooi居中。你應該做一個保留,然後,一旦你完成了setImage,做一個發佈。

+0

是的,真的!圖像視圖保留在NSOperation的init中(分配給self.view,其中視圖是非原子/保留屬性)。 (這是你/我已經知道的,但是Objective-C新增的隨便讀者可能不會):view = theView與self.view = viewView不一樣,當涉及到綜合屬性時。後者調用setter方法(以及它提供的所有好處)。前者直接分配給伊娃,不保留! 儘管如此,我使用的是調用NSURLRequest的requestWithURL的UIImageView的子類:cachePolicy:timeoutInterval :. – 2009-07-23 14:28:16