iOS MVC – Как передать данные с модели на контроллер?

Я сделал немало исследований по этому вопросу, но у меня есть умственный блок по моей проблеме. Я работаю над Objective-C для приложения iOS

Вот моя настройка:

  1. Контроллер представления получает текст из представления (пользовательский ввод) и передает этот текст в MethodA модели.

  2. MethodA в модели работает над текстом ввода и получает выход (например, ищет Google для этого текста). Он выполняет поиск с использованием метода dispatch_async, который вызывает селектор метода MethodB в модели.

  3. MethodB анализирует результат и помещает все результаты в NSMutableArray

  4. Мой вопрос здесь: как передать этот NSMutableArray для просмотра контроллера, чтобы я мог показать его в представлении?

Извините, если ответ на мой вопрос очень прост / очевиден. Я новичок в Objective-C

Я предполагаю, что передача объекта-делегата, отвечающего на селектор-метод, и вызов этого метода с обработанными данными будет хорошим способом достижения слабосвязанной структуры, которой заслуживает ваша программа. Вы знакомы с этой концепцией, или я выкопаю вам некоторые образцы кода?


UPDATE: примеры кода

Таким образом, я бы, вероятно, использовал вызывающий класс, например MyViewController , для реализации callbackMethod, myCallbackMethod следующим образом:

 -(void) myCallbakcMethod: NSMutableArray* array { //DoWhatever with the returned data } 

Дело в том, чтобы получить результат, возвращенный этому методу, когда вычисление завершено. Таким образом, в вашем MyViewController где вы вызываете MethodA вы передаете ссылку на делегата для обработки результата, namly self .

 //From this: [MyModel methodA:param1] //To: [MyModel methodA:param1:self] 

MyModel methodA и methodB необходимо добавить (id)delegate параметра (id)delegate и передать его между вызовами.

В methodB где данные myArray готовы, выполните следующий вызов:

  if([delegate respondsToSelector:@selector(myCallbackMethod:)]]) [observer performSelector:@selector(myCallbackMethod:) withObject:myArray]; 

Каждый раз, когда я хочу сделать асинхронную обработку, и что материал должен вернуться в интерфейс, я делаю одно из двух:

 1. Use NSNotification to tell anyone who cares that the work is complete 2. Use a delegate property on the worker and a @protocol 

1 NSNotification

Объект модели должен документировать в файле .h, что он запускает уведомления при возникновении определенных событий; например, когда часть модели была обновлена. Когда ViewController инициализирует объект модели, настройте его как наблюдателя документированного уведомления и выполните обратный вызов, который обновляет пользовательский интерфейс.

2 и @protocol

Создайте @protocol, например @protocol FooModelUpdateDelegate с соответствующим образом названным методом, например fooObjectDidUpdate:(Foo *)object; , а затем класс модели имеет свойство delegate как id<FooModelUpdateDelegate> updateDelegate и ViewController устанавливает себя как этот делегат, и я уверен, что вы можете выяснить остальное.

По вашему мнению, контроллер:

  // your controller code ... [myModel getSearchResult:searchKeyword receiver:self action:@selector(responseReceived:)]; } - (void)responseReceived:(MyModel *)model { NSArray *searchResult = model.searchResult; [model release], model = nil; // some view actions, for instance update your table view ... } 

В вашей модели:

 ... - (id)getSearchResult:(NSString *)searchKeyword receiver:(id)aReceiver action:(SEL)receiverAction { self.receiver = aReceiver; self.action = receiverAction; // some async actions } 

В приемнике асинхронного ответа:

  ... [self.receiver performSelector:self.action withObject:self]; } 

Если я не понимаю ваше описание, это звучит так, как будто ваш «модельный» класс делает больше, чем нужно. В этом случае он выполняет хотя бы часть работы вашего контроллера. Мое предложение состояло в том, чтобы свернуть метод A и methodB в контроллер представления (или другой класс контроллера). Метод B все еще может установить свойство NSMutableArray экземпляра «model», если это необходимо (или пропустите этот шаг, если это не так).

 -(void)methodA { NSMutableArray *someArray = ... [self methodB:someArray]; } -(void)methodB:(NSMutableArray*)array { NSLog(@"%@", array); // do something with the array, like update the view } 

Но если оба являются методами внутри контроллера представления, почему бы просто не обновить представление внутри метода, а не передать его другому методу?

  • Получить ракурс представления в UIView, который не контролируется
  • Память NSData не освобождается - ARC
  • self = revisited
  • Супер медленное отставание / задержка при начальной анимации клавиатуры UITextField
  • Почему вращение изображения с CGContextDrawImage происходит намного медленнее, чем рисование повернутого UIImage?
  • Разъяснения по управлению ориентациями в UIViewController
  • Асинхронные сетевые операции в iOS 5
  • Как сделать часть UIImageView прозрачной, чтобы показать виды в слоях ниже
  • Исходный фон iOS при просмотре представления
  • Почему я не использую NSLock?
  • Возвращать данные из NSOperation?
  • Давайте будем гением компьютера.