Вызов метода для делегата после задержки из объекта в конце его времени жизни - PullRequest
0 голосов
/ 04 декабря 2009

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

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

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

Есть предложения?

Ответы [ 4 ]

1 голос
/ 01 августа 2011

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

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

1 голос
/ 04 декабря 2009

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

1 голос
/ 04 декабря 2009

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

Скажите, что вы нажимаете Сохранить на своем модальном контроллере: вы отправите myViewController: didFinishSaving: делегату.

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

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

0 голосов
/ 15 ноября 2010

Вы также можете объявить своего делегата следующим образом:

    NSObject <MyClassDelegateProtocol> *delegate;

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

...