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

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

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

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

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

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

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

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

5 Solutions collect form web for “iOS MVC – Как передать данные с модели на контроллер?”

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


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 } 

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

  • CALayer не отображается
  • Анимация UIView внутри UITableViewCell
  • Разъяснения по управлению ориентациями в UIViewController
  • Неполадка с помощью NSMutableArray sortUsingDescriptors: exception
  • Синхронный Vs асинхронный на iPhone
  • Разделяется медленнее, чем Multiply?
  • KVC в подклассе UITableView вызывает сбой при доступности
  • SetFrame работает на iPhone, но не на iPad. Автомасштабировать маску?
  • Ядро рисования прямоугольника с рамкой в ​​одной строке
  • Запрос POST с AFNetworking 2.0 не работает, но работает в тесте HTTP-запроса
  • Панель вкладок с выпадающим меню
  • Interesting Posts

    Обнаружение сигналов сердцебиения с помощью «Цифрового датчика частоты сердечных сокращений (IC)» – iOS

    Как решить «NSUnknownKeyException» … setValue: forUndefinedKey:]: … не соответствует ключевому значению кодирования

    Настройка фонового изображения / просмотра в режиме просмотра камеры?

    Шаги по тестированию приложения iphone на устройстве (уже создан профиль / сертификат)

    Ошибка UIAlertController для представления в backgroundThread цель C

    Программно изменить массив связанных контактов в ABAddressBook, ABPersonCopyArrayOfAllLinkedPeople

    Как конвертировать xib в раскадровку?

    UIActivityViewController не показывает ссылку на facebook при совместном использовании

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

    iOS: сбой приложения "- "

    Создайте / запустите проект iOS Xcode с терминала

    SKPaymentQueue restoreCompletedTransactions восстанавливает одну и ту же транзакцию несколько раз

    Добавить внешнюю комбинацию клавиш для iPad-приложения?

    Ловушки при написании приложения iOS, поддерживающего iOS 3.1.3 и iOS 4.x

    IOSurface – IOS Private API – Снимок экрана в фоновом режиме

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.