gpt4 book ai didi

ios - NSNotificationCenter 并在 View Controller 和我的类之间传递数据/我走错了路吗?

转载 作者:行者123 更新时间:2023-11-29 05:02:49 25 4
gpt4 key购买 nike

出于测试目的,我创建了一个带有 UITabBar、3 个 View Controller 和我的 DataAnalyzer 类的应用程序(到目前为止,它什么也不分析:))。

TestAppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//.....
NSArray *allControllers = [self.tabBarController viewControllers];

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
for (UIVideoEditorController * viewController in allControllers) {
[center addObserver:viewController selector:@selector(useUpdatedData:) name:@"dataUpdated" object:nil];
NSLog(@"%@", [viewController description]);
}

DataAnalizer *dataAnalizer = [[DataAnalizer alloc] init];
[center addObserver:dataAnalizer selector:@selector(useUpdatedData:) name:@"dataUpdated" object:nil];
// dataAnalizer can't be released here? Where should it be done?
return YES;
}

在第二个、第三个 View Controller 和 DataAnalyzer 类中我添加了相同的方法

- (void) useUpdatedData:(NSNotification *)note {
NSLog(@"Notificatio received in *** view controller");

//do something with [note object] like show it on a label or store it to instance variable
}

在第一个 View Controller 中,我添加了文本字段以发送字符串作为通知

- (void)textFieldDidEndEditing:(UITextField *)textField {

NSLog(@"First viewController textFieldDidEndEditing: value is %@ ", textField.text);
NSNotificationCenter *note = [NSNotificationCenter defaultCenter];
[note postNotificationName:@"dataUpdated" object:textField.text];


}

当我发送字符串时,我在控制台中看到 NSLog 消息,表明已收到通知,但无法对该字符串执行任何操作,例如在标签上显示它。我知道这是因为 View Controller 第一次加载并且它们没有启动。但为什么我在控制台中收到 NSLog 消息?我可以将字符串发送到 dataAnalizer 类,在那里执行某些操作,然后将结果发送到第二个和第三个 View Controller 吗?预先感谢您的回答,因为以上似乎都是错误的方法。

最佳答案

Apple documentation非常清楚地表明 NSNotificationCenter 不保留它的观察者,这就是为什么你不能在那里释放 dataAnalyzer - 它将被释放并且通知将尝试发布到 nil 引用。

我认为循环遍历一组 Controller 并为每个 Controller 订阅通知不是一个好主意。 Controller 不能保证在此时被创建,并且因为它不知道它已被自愿回答通知,所以它也不知道取消订阅。相反,在每个 View Controller 的 -init 方法中订阅通知。这确保了 Controller 已创建并初始化,并使每个 Controller 对其自己的操作负责。

我不完全确定您的问题是什么,如果上述内容没有解决您的问题,您可以重新表述一下吗?

此外,请注意 NSNotificationCenter 会向所有观察者发布消息,但它不是异步的 - 它会等待每个观察者完成处理通知,然后再发送到下一个对象。

关于ios - NSNotificationCenter 并在 View Controller 和我的类之间传递数据/我走错了路吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6468683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com