2017-02-01 2 views
0

Я хочу использовать ссылку UICollectionView внутри моего NSOperation, но я не могу понять, как ее создать или передать в качестве аргумента.Использовать ссылку UICollectionView внутри NSOperation

Я думал о создании вара, а затем инициализации внутри 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 в рабочем блоке, но на самом деле вы не должны. Обновления пользовательского интерфейса должны происходить только в основном потоке, поэтому вам нужно просто захватить модель, выполнить некоторую работу в фоновом режиме, а затем отправить основной поток обратно на какую-либо функцию или блок, который будет обновлять collectionView. В этом примере предполагается, что он не переживет ViewController, что часто не является хорошим предположением. Используйте [слабое «я»] и выручайте, если сам ушел, если вы не собираетесь отменять операцию, когда viewController исчезает.

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

Глупый вопрос номер 2, то: не мог я просто проверить, что вид viewController виден перед выполнением какого-либо обновления? : if (ViewController(). isViewLoaded && (ViewController(). view.window! = nil)) {затем перейдите в главную очередь? – DuckMan

+0

Это захватывает самость, которая заставляет продлить срок службы себя до закрытия закрытия. [слабое я] не распространяется на жизнь самого себя. если вам все равно, будет ли viewController вокруг, пока он выключен, тогда окно! = nil будет работать. Вы можете протестировать свое время жизни, добавив в печать для деиниции на ВК и добавив NSthread. sleepForTimeInterval в вашем блоке, чтобы искусственно заставить его выдержать контроль над вашим контроллером. –

+0

Я не знаю, что это значит, но это звучит законно. Я пойду читать дальше. – DuckMan

Смежные вопросы