什么是NSManagedObjectContext最佳实践?

Aar*_*112 9 core-data objective-c ios

我正在使用基于导航控制器的iOS应用程序.有多个tableView屏幕可以从Core Data持久性存储中提取和保存数据.不同表视图的大多数数据来自NSFetchedResultsController实例或NSFetchRequests.

该应用程序按预期工作,但我得到了一些似乎与核心数据相关的随机崩溃和故障.例如,有时当我保存上下文时,应用程序会崩溃,但并非总是如此.我一直看到的另一件事是第一个tableView并不总是更新反映在其详细视图中修改的数据.

目前,我正在通过在将其推入导航堆栈之前设置视图控制器的context属性,将在app委托中创建的单个Managed Object Context传递给每个不同的视图控制器.

这似乎是一种笨重,笨拙的完成工作的方式.是否有更好的设计模式可供使用?

我在其中一个使用委托的WWDC会话中注意到,但我以前从未使用过创建自己的委托,也无法将其从WWDC会话中解脱出来.

谢谢.

=)

seu*_*ner 9

对所有控制器使用singleton NSManagedObjectContext不是最佳实践.

每个Controller都应该有自己的Context来管理文档存储中的特定(有时是原子)操作.

想想你是否可以编辑一个附加到Controller的NSManagedObject,它将相同的Context传递给其他Controller,它将选择另一个要删除或编辑的实例..你可能会丢失有关修改状态的控制.

创建视图控制器时,将向其传递上下文.您传递现有上下文,或者(在您希望新控制器管理一组离散编辑的情况下)为您创建的新上下文.应用程序委托通常负责创建上下文以传递给显示的第一个视图控制器.

http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html


Mat*_*art 4

1) 对 CoreData 设置使用单例(NSPecientStoreCoordinator、NSManagedObjectModel 和 NSManagedObjectContext)。您可以使用此单例来执行您在模型中创建的获取请求,并向上下文添加或删除实体。

2)代表并不那么难。以下是一个示例:

@class SomeClass

@protocol SomeClassDelegate <NSObject> //Implements the NSObject protocol
- (void) someClassInstance:(SomeClass *)obj givesAStringObject:(NSString *)theString;
- (BOOL) someClassInstanceWantsToKnowABooleanValue:(SomeClass *)obj //Call to delegate to get a boolean value

@optional
- (NSString *) thisMethodIsOptional; 

@end

@interface SomeClass : NSObject {
   id<SomeClassDelegate> delegate;
   //Other instance variables omitted.
}
@property (assign) id<SomeClassDelegate> delegate;
@end

@implementation SomeClass
@synthesize delegate;
- (void) someMethodThatShouldNotifyTheDelegate {
   NSString *hello = @"Hello";
   if (self.delegate != nil && [self.delegate respondsToSelector:@selector(someClassInstance:givesAStringObject:)]) {
      [self.delegate someClassInstance:self givesAStringObject:hello];
   }
}
@end
Run Code Online (Sandbox Code Playgroud)

选项 1 可能是这样的,您必须在对象的 init 中设置变量(当然还要实现单例):

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface CoreDataUtility : NSObject {
@private
    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;
    NSPersistentStoreCoordinator *persistentStoreCoordinator;
}

+ (CoreDataUtility *)sharedCoreDataUtility;
- (NSEntityDescription *) entityDesctiptionForName:(NSString *)name;
- (NSMutableArray *) executeRequest:(NSFetchRequest *)request;
- (id) getInsertedObjectForEntity:(NSString *)entity;
- (void) deleteAllObjects:(NSString *) entityName;
- (void) deleteManagedObject:(NSManagedObject *)object;
- (void) saveContext;

@end
Run Code Online (Sandbox Code Playgroud)