存储单个BOOL全局数据值的最佳方法

时间:2013-02-27 08:55:03

标签: ios objective-c

我需要一些关于开发iOS应用程序设计的最佳实践的建议

这就是我正在处理的问题:当iOS设备丢失互联网连接(或者没有互联网连接)时,我希望我的应用程序进入某种离线模式,即触发某些事件,发送一些NSNotifications ,mb显示某种警报等。因此,当iOS设备获得它的连接时我想要相反的东西 - 将我的应用程序移动到某种在线模式。

所以,我想要的是能够从我的一些ViewControllers中访问应用程序模式(即检查应用程序是在线还是离线)。我正在考虑两种存储应用程序状态的方法:

1)拥有一些AppDelegate的属性,并通过我的AppDelegate从任何地方访问它。 AFAIK,这是一种错误的方法,因为AppDelegate不应该用作应用程序的全局对象,而是用于启动初始化和控制应用程序的状态更改。

2)将此信息存储在模型级别。但我不知道为了这个目的我应该在Model级别上使用什么。我不认为使用Core Data或NSUserDefaults是一个好主意,因为我不希望这个属性是持久的,我只在当前的应用程序运行期间需要它。除了Core Data和NSUserDefaults之外,我实际上并不了解任何其他模型级技术。

我没有包含任何代码示例,因为它主要是一个理论问题。

3 个答案:

答案 0 :(得分:6)

您可以使用单例模式并将变量存储为属性

例如

@interface GlobalData : NSObject

@property BOOL connectionAvailable;

+ (GlobalData *)sharedInstance;

@end

@implementation

+ (GlobalData *)sharedInstance {
    static GlobalData *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[GlobalData alloc] init];
    });
    return sharedInstance;
}

@end

// --- in some method
[GlobalData sharedInstance].connectionAvailable = /* connection state */;

// --- in some other method
BOOL connectionAvailable = [GlobalData sharedInstance].connectionAvailable;

答案 1 :(得分:1)

第二种方法效果最好。您肯定不需要任何持久性指示互联网连接的属性。一个好处是让你的Model成为一个单独的类,它为Internet连接公开了一个只读BOOL属性,你的视图控制器可以通过键值观察来订阅它的变化。您的模型还可以在内部实现Reachability类来更新Internet连接状态。

答案 2 :(得分:1)

我假设你正在使用Apple的Reachability类。 http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html

我在Reachability类上创建了一个类别来添加一个sharedInstance单例,它允许您检查Internet连接的状态。我在我的所有应用中使用它。

以下是你做单身人士的方式:

How do I implement an Objective-C singleton that is compatible with ARC?