【问题标题】:Making Core Data Model Class Accessible (App design)使核心数据模型类可访问(应用程序设计)
【发布时间】:2014-07-04 03:46:11
【问题描述】:

开始了“单身”的道路。 (哇!!)现在,尝试追溯一些步骤并将核心数据堆栈从应用程序委托中取出。

在讨论这个问题时,我看到了以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions {
    DataModel *dataModel = [[DataModel alloc] init];
    self.rootViewController.dataModel = dataModel;
    ...
}

在 DataModel.m 中是核心数据堆栈、启动 Web 服务的方法和将返回的数据保存到核心数据中的方法。连接是另一类。

启动、启动连接、将托管对象上下文传递给根视图控制器并接收 Web 数据都可以正常工作。然后,在 Connection 类中发布的通知(在完成数据接收时)通知 DataModel 要处理的数据。问题是 DataModel 已被释放。应用崩溃。

在放弃 DataModel 的 (shhh) 单例类之后,问题是:如何保留 DataModel 来处理接收到的用于核心数据的 Web 数据?或者,将核心数据堆栈拆分并将接收到的数据处理成2个文件会更好吗?

将核心数据堆栈和处理方法放在一个类中似乎是合乎逻辑的。我想通过将上下文从控制器传递到控制器来构建这个应用程序。

【问题讨论】:

    标签: ios core-data model-view-controller


    【解决方案1】:

    我有一个类,“SVODataHelper”,里面有这个:

    #pragma mark - Setup
    
    - (id) init
    {
        self = [super init];
        if (!self)
            return nil;
        _model = [NSManagedObjectModel mergedModelFromBundles:nil];
        _coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_model];
        _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_context setPersistentStoreCoordinator:_coordinator];
        return self; 
    }
    
    - (void) loadStore
    {
        if (_store)
            return;
        NSError *error = nil;
        _store = [_coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:nil error:&error];
        if (!_store)
        {
            NSLog(@"Failed to add store. Error: %@", error);
            abort();
        }
    }
    
    - (void) setupCoreData
    {
        [self loadStore];
    }
    

    然后,在 AppDelegate 中,我使用:

    - (SVOData *)svoData
    {
        if (!_svoDataHelper)
        {
            static dispatch_once_t predicate;
            dispatch_once (&predicate, ^{ _svoDataHelper = [[SVOData alloc] init]; }); // insures a single instance created to guarantee thread safety.  
            [_svoDataHelper setupCoreData];
        }
        return _svoDataHelper;
    }
    

    最后,我通过以下方式访问辅助类:

        svoDataHelper = [(AppDelegate *)[[UIApplication sharedApplication] delegate] svoData];  
    

    我不知道它是好是坏,但它确实有效。我从我读过的一本书(“Learning IOS Core Data?”)中得到了这个概念,它看起来很干净,因为它允许我将基本内容保存在一个单独的类中,同时避免传递指向该类的指针。

    【讨论】:

    • 有趣。谢谢。也许这说明了为什么 Apple 在模板的应用程序委托中包含核心数据。 svoData 中有很多内容:需要分类和消化。这不还是dispatch_once函数的单例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多