iOS跨视图控制器共享"全局数据"

gee*_*eks 7 iphone cocoa-touch objective-c sharing ios

我一直在使用app delegate作为"全局存储桶"来在各种视图控制器之间共享数据.通常我做这样的事情:

My_AppDelegate *appDelegate = (My_AppDelegate *)[[UIApplication sharedApplication] delegate];
Run Code Online (Sandbox Code Playgroud)

然后,我会将数据粘贴到appDelegate中,并使用另一个视图控制器从appDelegate中获取数据.不知何故,这似乎笨拙和不恰当(虽然它确实有效).

有没有更好的办法?我可以在某种全局共享区域设置一个"监听器",如果有人在那里粘贴数据元素,另一个对象会得到一个"回叫",让它知道某人有数据准备好了吗?

在Java中,我们曾经使用Observer/Observable类做到这一点 - 也许有类似的东西,或者在iOS中更好?

Mar*_*off 3

一种更简洁(虽然不一定不同)的方法是创建一个单例类,例如AppData,您可以通过多种方式访问​​它,并且它可供所有其他类使用。它的好处是将应用程序特定的内容与应用程序委托的内容分开。您可以这样定义该类:

@interface AppData:NSObject

// 也许您会在这里声明一些类方法...

@结尾

我做的一个常见的事情是在这样的类上定义类方法来访问,例如,设置值或特定于应用程序的常量或其他单例对象。有很多可能性。

最后,您只需使用类方法就可以完成很多工作,您可以将其称为[AppData theMethod]. 请记住,无法self在类方法内部进行访问。

更进一步,您可以为 AppData 类定义 ivars,然后管理 AppData 的单例实例。使用类方法,例如+sharedInstance,获取单例的句柄,然后可以在其上调用方法。例如,[[AppData sharedInstance] someMethod:myArgument]。您可以在 的实现+sharedInstance中管理单例的实际创建,该方法最终会返回该单例。

我不确定是否会将这种方法称为“最佳实践”,但我发现这种模式非常方便。