2017-02-01 34 views
0

我想在我的NSOperation裏面使用UICollectionView的引用,但我不知道如何創建它或將它作爲參數傳遞。在NSOperation裏面使用UICollectionView的引用

我想創造一個變種,然後初始化內部NSOperation像:

class MyOperation: Operation { 

    var collectionView: UICollectionView! 

    init(col: UIColletionView) { 
     collectionView = col 
    } 
} 

,然後使操作時要排隊使用它作爲參數:

myQueue.addOperation(MyOperation(col: collectionView)) 

但我得到一個錯誤在init行:「使用未聲明的類型」。我知道它沒有宣佈,我不知道它是什麼,直到我得到論據。

+0

可能是初始化程序中的一個拼寫錯誤:col的類型爲'UIColletionView';你是不是指'UICollecionView'(帶有「c」)? –

+0

好吧,根本不會令人尷尬。我會停止看這一段時間。謝謝 – DuckMan

+1

lol @AndreasOetjen一個錯字交換了另一個...... – shim

回答

1

addOperation也有一個block parameter overload。您可以在操作塊中捕獲collectionView,但實際上不應該。 UI更新應該只發生在主線程上,所以實際上你應該捕獲模型,在後臺做一些工作,然後在主線程上派發回一些函數或塊來更新collectionView。這個例子假設它不會超過ViewController,這通常不是一個好的假設。如果你不打算在viewController消失時取消操作,那麼使用[weak self]並保留自我。

myQueue.addOperation { 
    //Update model here 
    DispatchQue.main.asynch { 
     self.collectionView.reloadData() 
    } 
} 
+0

愚蠢的問題2然後:我不能只檢查視圖viewController是否可見之前做任何更新? :if(ViewController()。isViewLoaded &&(ViewController()。view.window!= nil)){then go main queue? – DuckMan

+0

捕捉自我,這會導致自我的生命週期被延長,直到關閉完成。 [弱自我]不會延長自我的生命。如果你不關心viewController是否在屏幕外,那麼window!= nil將會起作用。你可以通過添加一個打印來在VC上刪除並添加一個NSthread來測試你的生活時間。 sleepForTimeInterval在你的塊中人爲地使它超過你的視圖控制器。 –

+0

我不知道這意味着什麼,但它聽起來合法。我會讀更多。 – DuckMan

相關問題