我正在使用基于导航控制器的iOS应用程序.有多个tableView屏幕可以从Core Data持久存储中提取和保存数据.不同表视图的大部分数据来自NSFetchedResultsController实例或NSFetchRequests.
该应用程序按预期工作,但我已经收到一些似乎与Core Data有关的随机崩溃和故障.例如有时候,当我保存上下文应用程序将崩溃,但不总是.我看到的另一件事是,第一个tableView并不总是更新,反映了在其详细视图中修改的数据.
目前,我正在传递一个单一的管理对象上下文,它是通过在将视图控制器推送到导航堆栈之前设置视图控制器的上下文属性而在每个不同视图控制器的应用程序委托中创建的.
这似乎是一个笨重的,黑客的方式来完成工作.有更好的设计模式吗?
我在其中一个WWDC会议中注意到使用委托,但我从来没有使用过创建我自己的代理,并且无法将其从WWDC会话中解脱出来.
谢谢.
=)
解决方法
1)
为您的CoreData设置(NSPesistentStoreCoordinator,NSManagedObjectModel& NSManagedObjectContext)使用单例.您可以使用此单例来执行您在模型中创建的提取请求,并向实体添加或删除实体.
为您的CoreData设置(NSPesistentStoreCoordinator,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
选项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