一般设计 - 我在哪里放置集中访问的对象

时间:2012-07-24 15:20:17

标签: ios

我有我的主应用代表 我有一些由Storyboard

驱动的UIViewController派生实例

说我想为我的应用程序提供一个集中的持久层 - 也许是SQLite的核心数据。我会把这些物品放在哪里?我错过了一些可以从所有UIViewController实例访问的可集中访问的“Application”类。

这里有一种模式吗?

3 个答案:

答案 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]);

希望这是你所需要的。

享受编码:)