2015-03-27 3 views
0

Как я могу уведомить контроллер представления о новом обновлении модели без использования уведомлений, делегатов или KVO? Меня спросили в интервью, могу ли я использовать блоки, чтобы уведомить контролера моего обновления? Можете ли вы дать мне пример того, как я буду использовать блоки для этого?Обновить контроллер представления обновления данных в модели

ответ

1

Существует много обсуждений по теме, о которой вы спрашиваете (выбор между делегацией, уведомлениями, наблюдениями и блоками). Я посмотрю, могу ли я объяснить, почему и как быстро использовать блоки:

Вы должны использовать блок, если есть только одно или два события, чтобы сообщить об этом наблюдающему/вызывающему объекту. Пример из библиотеки IOS находится в NSURLSessionDataTask классе - это есть метод:

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler 

Поскольку существует только ограниченное количество вещей, которые могут произойти на сетевой вызова (она проходит через успешно или не удается), используется блок.

С другой стороны, вы можете использовать делегирование, когда есть много разных событий, чтобы уведомить наблюдателя/делегата. Хорошим примером является UITextField - текстовое поле в iOS может начинатьсяEditing, endEditing, изменять символы в поле, очищать, возвращать и т. Д. Не стоит перегружать блок со всеми различными параметрами. Таким образом, делегирование используется для того, чтобы делегат мог выбрать, какие события ему необходимо знать/обновляться, а также пропускать другие.

Чтобы использовать это на вашей модели, вы можете, есть метод, модель, которая выглядит, как это, например:

- (void) saveObject:(NSObject*)object completionHandler:(void (^) (BOOL success, NSError *error))completionHandler

Это обновить объект, который пройдет в, а затем запустить блок вы проходите когда он заканчивается. Внутри этого блока вы можете получить доступ к флажку успеха, а также к возможной ошибке. Вы можете вызвать это прямо из своего контроллера просмотра и использовать переменные, определенные в указанном контроллере представления.

Вся дискуссия - это скорее форма искусства, чем точная наука. Если вы хотите узнать больше об этом, не стесняйтесь, чтобы взглянуть на некоторые должности, как следующее:

http://stablekernel.com/blog/blocks-or-delegates/ http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/

0

ReactiveCocoa другое возможное решение. ReactiveCocoa - популярная структура, которая работает аналогично KVO, но вместо этого использует блоки.

заказ раздел введение на своей странице GitHub для простого примера:

https://github.com/ReactiveCocoa/ReactiveCocoa#introduction

Там также некоторые хорошие учебники по теме:

http://www.raywenderlich.com/62699/reactivecocoa-tutorial-pt1

+0

Спасибо вам за ответ, но я полагают, что ReactiveCocoa использует KVO за кулисами –

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