2009-12-04 5 views
0

У меня есть модальный контроллер представления, который создает изменения основных данных в своем собственном контексте, и когда я нажимаю кнопку «« «« Сделано », он сохраняет изменения (отправляет уведомление об изменении слияния), уведомляет делегата и увольняет.Вызов метода на делегат после задержки, от объекта в конце его жизненного цикла

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

  1. Сделать звонок [delegate performSelector:withObject:afterDelay:] Однако, похоже, что это сообщение не распознается. Мой делегат соответствует протоколу NSObject, но не включает селектор выполнения с задержкой.
  2. Создайте метод в моем контроллере: informDelegateWithObject:, который вызывает метод делегата и вызывает этот метод после задержки. То есть [self performSelector:@selector(informDelegateWithObject:) withObject:.. afterDelay:..]. Однако это может сработать, так как мой диспетчер просмотров отклоняется, если задержка составляет несколько секунд, тогда она была бы освобождена из памяти и не вызвала бы сбой при вызове?
  3. Создать экземпляр NSInvocation. Однако я подумал об этом, какова продолжительность жизни этого объекта? Если я создам его с помощью [NSInvocation invocationWithMethodSignature:], то не будет ли объект NSInvocation автореализован, а не для следующего цикла цикла? Не говоря уже о нескольких секундах. И поскольку мой диспетчер модального просмотра отклоняется и освобождается, я не могу сохранить объект вызова в моем контроллере представления.

Любые предложения?

ответ

1

Вы должны объединить контексты в делегат.

Скажите, что вы нажимаете Save to you modal controller: вы отправите myViewController: didFinishSaving: в делегат.

Этот делегат в myViewController: didFinishSaving: реализация будет сохранять, объединять и отклонять контроллер модального представления.

Надеюсь, я понял вашу проблему. Пока! :)

+0

Спасибо за ваш ответ. У меня на самом деле есть другой шаблон, это довольно сложное приложение, и мой EVC (редактор вида редактирования) вызывается из нескольких мест и, следовательно, может иметь несколько делегатов. Контекст и экономия - все это аккуратно обработано из EVC. Я просто хочу узнать, как лучше всего вызывать методы после задержки с проблемами времени жизни объекта, описанными в вопросе. Есть идеи? –

+0

Вы все еще можете использовать мой шаблон. В myViewController: didFinishSaving: реализация вы можете вызвать метод на myViewController ... например [myViewController saveAndMergeWithMOC: self.managedObjectContext], а затем уволить. Говоря о вызове селекторов с задержкой ... Я ничего не вижу, используя performSelector: withObject: afterDelay :. Если вы хотите подавить предупреждение компилятора, вы можете определить протокол, который включает этот метод. В любом случае он должен работать, потому что UIViewController наследует от NSObject и @selector (performSelector: withObject: afterDelay :) будет найден по времени выполнения Objective-C – muccy

1

Возможно, вы изучите основные данные Apple Core Books, которые работают по строкам, которые описывает muccy. Сохранение происходит после отклонения модального представления и управления возвращается родительскому контроллеру представления. Родитель содержит код обновления и запускает уведомления, необходимые для слияния изменений (независимо от того, происходит это в делегате или в другом месте).

+0

Спасибо за ваш ответ и за вашу помощь по другим вопросам здесь :-) Как уже упоминалось в моем комментарии к ответу muccy, я использую несколько другой шаблон, это довольно сложное приложение, и мой редактор редактирования редактирования аккуратно обрабатывает контекст редактирования и сохранение. Я просто хочу узнать, как лучше всего вызывать методы после задержки с проблемами времени жизни объекта, описанными в вопросе. Есть идеи? –

0

Вы также можете объявить делегат, как это:

NSObject <MyClassDelegateProtocol> *delegate; 

Тогда ваш делегат также будет NSObject, который соответствует вашему протоколу.

1

К вопросу № 1: performSelector:withObject:afterDelay: определен в классе NSObject, а не в протоколе NSObject. Любой объект, который вы используете, вероятно, является экземпляром NSObject. Вероятно, вы имеете в виду компилятор предупреждение, связанный с проверкой статического типа. (Технически, для объекта, который соответствует протоколу NSObject, не может быть NSObject, NSProxy является одним из примеров. Но любой объект, который вы обычно используете, будет NSObject.) Вы можете игнорировать это предупреждение (в Objective-C вы можете попробуйте отправить любое сообщение на любой объект).Или, если хотите, вы можете отправить его либо id (который позволяет отправлять любые сообщения без каких-либо предупреждений) или NSObject *.

На вопрос №2: «если задержка составляет несколько секунд, то она была бы освобождена из памяти» Нет, в документации для performSelector:withObject:afterDelay: говорится: «Этот метод сохраняет приемник и параметр anArgument до тех пор, пока селектор не будет выполнен».