1

我有我的主要应用程序委托我有一些由 Storyboard 驱动的 UIViewController 派生实例

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

这里有一个模式可以遵循吗?

4

3 回答 3

2

你应该检查单例模式

在软件工程中,单例模式是一种将类的实例化限制为一个对象的设计模式。当需要一个对象来协调整个系统的动作时,这很有用。这个概念有时被推广到当只有一个对象存在时运行效率更高的系统,或者将实例化限制为一定数量的对象。该术语来自单例的数学概念。

这是示例实现的来源:我的 Objective-C 单例应该是什么样子?

这是现代解决方案的直接链接: https ://stackoverflow.com/a/145395/644629

于 2012-07-24T15:23:45.420 回答
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]);

希望这是您所需要的。

享受编码:)

于 2012-07-24T16:05:16.050 回答
0

您所描述的是您的模型层。管理模型有两种主要方法:

  • 在应用程序启动时,创建主模型对象并将其交给第一个视图控制器。
  • 使主模型对象成为单例。

两种情况下的“主要模型对象”通常是某种对象管理器。它可能是一个文档,或者PersonManager如果你有一堆Person对象,它可能是一个。该对象将从您的持久存储(通常是核心数据)中出售模型对象。

这里单例的优点是实现起来更容易一些,而且你不必绕过管理器。非单例的优点是更容易拥有多个(对于基于文档的系统),并且比单例更容易测试和推理非单例。也就是说,可能我 80% 的项目都使用单例模型管理器。

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

于 2012-07-24T15:26:28.600 回答