0

我有一个模态视图控制器,它在它自己的上下文中创建核心数据更改,当我单击完成时,它会保存更改(调度合并更改通知),通知委托并关闭。

我的问题是,在我的主要上下文与编辑上下文的更改合并后,我需要委托接收消息。我希望在下一个运行循环中进行委托调用,但我遇到了对象生命周期的问题。我想到了以下几点:

  1. 拨打电话,[delegate performSelector:withObject:afterDelay:]但似乎无法识别该消息。我的委托符合NSObject协议,但不包括延迟执行选择器。
  2. 在我的视图控制器中创建一个方法:informDelegateWithObject:调用委托方法,并在延迟后调用该方法。即[self performSelector:@selector(informDelegateWithObject:) withObject:.. afterDelay:..]。但是,这可能会起作用,因为我的视图控制器正在被解除,如果延迟是几秒钟,那么它就会从内存中释放出来,并且在调用时不会导致崩溃吗?
  3. 创建一个NSInvocation. 我有想过这个,但是,这个对象的生命周期是多少?如果我使用它创建它,[NSInvocation invocationWithMethodSignature:]那么NSInvocation对象不会被自动释放,并且不会出现在下一个运行循环中吗?更别说几秒钟了。当我的模态视图控制器被解除和释放时,我无法将调用对象存储在我的视图控制器中。

有什么建议么?

4

4 回答 4

1

您应该将上下文合并到委托中。

假设您在模态控制器中按下 Save:您将发送一个 myViewController:didFinishSaving: 给委托。

这个委托到 myViewController:didFinishSaving: 实现将保存、合并和关闭模态视图控制器。

我希望我已经理解了你的问题。再见!:)

于 2009-12-04T10:03:02.563 回答
1

您可能会查看 Apple 的 Core DataBooks教程,该教程与 muccy 描述的内容一致。在模式视图被关闭并将控制权返回给父视图控制器后进行保存。父级包含更新代码并触发合并更改所需的通知(无论是在委托中还是在其他地方发生)。

于 2009-12-04T10:26:07.040 回答
1

问题#1:performSelector:withObject:afterDelay:是在 NSObject 类中定义的,而不是在 NSObject 协议中。您使用的任何对象都可能是 NSObject 的一个实例。您可能指的是静态类型检查导致的编译器警告。(从技术上讲,符合 NSObject 协议的对象可能不是 NSObject;NSProxy 就是一个例子。但是您通常使用的任何对象都是 NSObject。)您可以忽略此警告(在 Objective-C 中,您可以尝试向任何对象发送任何消息)。或者,如果您愿意,您可以将其转换为id(这允许您发送任何消息而不会发出任何警告)或NSObject *.

To question #2: "if the delay is several seconds then it would have been released from memory" No, the documentation for performSelector:withObject:afterDelay: says "This method retains the receiver and the anArgument parameter until after the selector is performed."

于 2011-08-01T00:50:30.193 回答
0

你也可以像这样声明你的委托:

    NSObject <MyClassDelegateProtocol> *delegate;

那么你的委托也将是一个符合你的协议的 NSObject。

于 2010-11-15T12:41:02.230 回答