2009-12-04 103 views
0

我有一个模式视图控制器,它在自己的上下文中创建核心数据更改,当我单击完成时,它会保存更改(调度合并更改通知),通知委托并解散。在延迟后在对象上调用委托方法

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

  1. 拨打电话[delegate performSelector:withObject:afterDelay:]但是看起来好像该邮件无法识别。我的委托符合NSObject协议,但不包括具有延迟的执行选择器。
  2. 在我的视图控制器中创建一个方法:informDelegateWithObject:,它调用委托方法,并在延迟后调用该方法。即[self performSelector:@selector(informDelegateWithObject:) withObject:.. afterDelay:..]。然而,这可以工作,因为我的视图控制器正在被解雇,如果延迟几秒钟,那么它会从内存中释放,并不会导致崩溃,当涉及到调用?
  3. 创建一个NSInvocation的实例。我曾经想过,但是,这个对象的寿命是多少?如果我使用[NSInvocation invocationWithMethodSignature:]创建它,那么NSInvocation对象不会被自动发布,并且不会在下一个运行循环中出现?别说几秒钟了。当我的模式视图控制器被解散和释放时,我无法将调用对象存储在我的视图控制器中。

有什么建议吗?

回答

1

您应该将上下文合并到委托中。假设你按下保存到你的模态控制器:你将发送一个myViewController:didFinishSaving:给委托。

此代理进入myViewController:didFinishSaving:实现将保存,合并和解除模态视图控制器。

我希望我明白你的问题。 再见! :)

+0

感谢您的回复。实际上我有一个不同的模式,它是一个相当复杂的应用程序,我的EVC(编辑视图控制器)从多个地方调用,因此可以有多个代表。上下文和保存都完全由EVC处理。我真的只是想知道在延迟之后调用方法的最佳方法,并且问题中描述的对象生存期问题。有任何想法吗? – 2009-12-04 10:57:05

+0

你仍然可以使用我的模式。 在myViewController:didFinishSaving:实现中,您可以调用myViewController上的方法...像[myViewController saveAndMergeWithMO​​C:self.managedObjectContext],然后关闭。 说到延迟调用选择器... 我看到没有错误使用performSelector:withObject:afterDelay :.如果你想压制编译器的警告,你可以定义一个包含该方法的协议。 在任何情况下,它必须工作,因为UIViewController继承自NSObject,并且@selector(performSelector:withObject:afterDelay :)将被Objective-C运行时找到 – muccy 2009-12-04 11:48:02

1

你可能会看看苹果公司的核心数据Books教程,它沿着muccy描述的方向工作。在模式视图关闭并且控制返回到父视图控制器之后发生保存。父代包含更新代码并触发合并更改所需的通知(无论是在代理还是其他地方发生)。

+0

感谢您的回应,以及您对我的其他问题的帮助这里:-)正如我在muccy的回答中提到的,我使用的是一个稍微不同的模式,它是一个相当复杂的应用程序,我的编辑视图控制器整齐地处理编辑上下文和保存。我真的只是想知道在延迟之后调用方法的最佳方法,并且问题中描述的对象生存期问题。有任何想法吗? – 2009-12-04 10:57:57

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参数,直到执行选择器为止”。