我有我的主要应用程序委托我有一些由 Storyboard 驱动的 UIViewController 派生实例
假设我想为我的应用程序提供一个集中的持久层——也许是 SQLite 的核心数据。我会把这些物品放在哪里?我缺少一些可以从所有 UIViewController 实例中访问的可集中访问的“应用程序”类。
这里有一个模式可以遵循吗?
我有我的主要应用程序委托我有一些由 Storyboard 驱动的 UIViewController 派生实例
假设我想为我的应用程序提供一个集中的持久层——也许是 SQLite 的核心数据。我会把这些物品放在哪里?我缺少一些可以从所有 UIViewController 实例中访问的可集中访问的“应用程序”类。
这里有一个模式可以遵循吗?
你应该检查单例模式:
在软件工程中,单例模式是一种将类的实例化限制为一个对象的设计模式。当需要一个对象来协调整个系统的动作时,这很有用。这个概念有时被推广到当只有一个对象存在时运行效率更高的系统,或者将实例化限制为一定数量的对象。该术语来自单例的数学概念。
这是示例实现的来源:我的 Objective-C 单例应该是什么样子?
这是现代解决方案的直接链接: https ://stackoverflow.com/a/145395/644629
使用具有应用程序生命周期范围的单例模式。
@interface DataManager ()
@end
#pragma mark -
@implementation DataManager
#pragma mark - Shared Instance
static DataManager* sharedInstance = nil;
#pragma mark - Singleton Methods
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
+ (DataManager*)sharedInstance
{
@synchronized([DataManager class])
{
if (!sharedInstance) {
//[[self alloc] init];
sharedInstance = [[DataManager alloc] init];
}
return sharedInstance;
}
return nil;
}
+ (id)alloc
{
@synchronized([DataManager class])
{
NSAssert(sharedInstance == nil, @"Attempted to allocate a second instance \
of a singleton.");
sharedInstance = [super alloc];
return sharedInstance;
}
return nil;
}
@end
在 .h 文件中声明您的属性并在 .m 文件中合成它们。
要使用该属性,只需调用:
// set value
[[DataManager sharedInstance] setSharedProperty:@"ABC"]; // If its a string
// get Value
NSLog(@"value : %@", [[DataManager sharedInstance] sharedProperty]);
希望这是您所需要的。
享受编码:)
您所描述的是您的模型层。管理模型有两种主要方法:
两种情况下的“主要模型对象”通常是某种对象管理器。它可能是一个文档,或者PersonManager
如果你有一堆Person
对象,它可能是一个。该对象将从您的持久存储(通常是核心数据)中出售模型对象。
这里单例的优点是实现起来更容易一些,而且你不必绕过管理器。非单例的优点是更容易拥有多个(对于基于文档的系统),并且比单例更容易测试和推理非单例。也就是说,可能我 80% 的项目都使用单例模型管理器。
作为旁注,您似乎已经理解:永远不要将模型存储在应用程序委托中,也永远不要将应用程序委托用作“集合点”来访问模型。也就是说,永远不要sharedModel
在应用程序委托上使用方法。如果您发现自己[[UIApplication sharedApplication] delegate]
在代码中的任何位置调用,那么您几乎总是在做错事。将数据挂在应用程序委托上会使代码重用变得极其困难。