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

Ios 一般设计-我在哪里放置集中访问的对象,ios,Ios,我有我的主应用程序代理 我有几个UIViewController派生的实例是由故事板驱动的 假设我想为我的应用程序提供一个集中的持久性层——可能是SQLite的核心数据。我应该把这些东西放在哪里?我缺少一些您可以从所有UIViewController实例访问的可集中访问的“应用程序”类 这里有模式吗?您应该检查: 在软件工程中,单例模式是一种设计模式 它将类的实例化限制为一个对象。这是 仅当需要一个对象来跨多个对象协调操作时非常有用 系统。这个概念有时被推广到 当仅存在一个对象或限制 对一定数量

我有我的主应用程序代理 我有几个UIViewController派生的实例是由故事板驱动的

假设我想为我的应用程序提供一个集中的持久性层——可能是SQLite的核心数据。我应该把这些东西放在哪里?我缺少一些您可以从所有UIViewController实例访问的可集中访问的“应用程序”类

这里有模式吗?

您应该检查:

在软件工程中,单例模式是一种设计模式 它将类的实例化限制为一个对象。这是 仅当需要一个对象来跨多个对象协调操作时非常有用 系统。这个概念有时被推广到 当仅存在一个对象或限制 对一定数量的对象进行实例化。这个词来自 单子的数学概念

以下是示例实现的源代码:

这是现代解决方案的直接链接:
您所描述的是您的模型层。管理模型的主要方法有两种:

  • 在应用程序启动时,创建主模型对象并将其交给第一个视图控制器
  • 使主模型对象成为单例对象
这两种情况下的“主模型对象”通常是某种对象管理器。它可以是一个文档,也可以是一个
PersonManager
,如果您有一堆
Person
对象。此对象将从持久性存储中提供模型对象(通常是核心数据)

这里使用单例的优点是,它更容易实现,而且您不必绕过经理。非单例的优点是(对于基于文档的系统)更容易拥有多个单例,并且比单例更容易对非单例进行测试和推理。也就是说,我的项目中大约有80%使用单例模型管理器


作为旁注,您似乎已经理解了:永远不要将模型存储在应用程序委托中,永远不要将应用程序委托用作到达模型的“集合点”。也就是说,永远不要在应用程序委托上使用
sharedModel
方法。如果您发现自己在代码中的任何地方调用
[[UIApplication sharedApplication]delegate]
,那么您几乎总是在做错事。挂起应用程序委托上的数据会使代码重用变得极其困难。

使用单例模式,它具有应用程序生命周期的范围

@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]);
希望这是你所需要的


喜欢编码:)

这正是我应该写的。更现代的实现使用GCD的dispatch_once函数。不过,仅供参考,相关问题已经过时了。最好的答案(
dispatch\u once
)就隐藏在列表的下面。是的,这是真的,但我认为他需要一个单例模型类来存储一些全局数据。完全同意(嗯,大约80%的时间…:我想我的答案是另一个常见的解决方案)。这就是我所指的隐藏在列表中的那个。我建议对过时的答案投反对票,但那太卑鄙了。:)当他们被写的时候,他们是完全合适的。