我有我的主应用代表 我有一些由Storyboard
驱动的UIViewController派生实例说我想为我的应用程序提供一个集中的持久层 - 也许是SQLite的核心数据。我会把这些物品放在哪里?我错过了一些可以从所有UIViewController实例访问的可集中访问的“Application”类。
这里有一种模式吗?
答案 0 :(得分:2)
您应该查看singleton pattern:
在软件工程中,单例模式是一种设计模式 将类的实例化限制为一个对象。这是 当需要一个对象来协调跨越的操作时非常有用 系统。这个概念有时会推广到那些系统 当只有一个对象存在或限制时,操作更有效 实例化到一定数量的对象。这个词来自 单身人士的数学概念。
以下是示例实现的来源:What should my Objective-C singleton look like?
这是现代解决方案的直接链接: https://stackoverflow.com/a/145395/644629
答案 1 :(得分:0)
您所描述的是您的模型层。管理模型有两种主要方式:
两种情况下的“主模型对象”通常都是某种对象管理器。它可以是一个文档,如果你有一堆PersonManager
个对象,它可能是Person
。此对象将从持久性存储(通常为Core Data)中提供模型对象。
Singleton的优势在于它实现起来更容易,而且您不必传递经理。非单身人士的优势在于,拥有多个(对于基于文档的系统)更容易,并且比单身人士更容易测试和推理非单身人士。也就是说,我的项目中有80%使用单身模型管理器。
作为旁注,您似乎已经理解:永远不要将模型存储在应用程序委托中,并且永远不要将应用程序委托用作到达模型的“集合点”。也就是说,在应用程序委托上永远不会有sharedModel
方法。如果您发现自己在代码中的任何位置调用了[[UIApplication sharedApplication] delegate]
,那么您几乎总是在做错事。在应用程序委托上挂起数据会使代码重用变得非常困难。
答案 2 :(得分:0)
使用具有应用程序生命周期范围的单例模式。
@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]);
希望这是你所需要的。
享受编码:)