我有一个关于管理对单例的访问的问题,此时它的初始化可能尚未完成,它是第一次使用。我创建了一个名为 StoriesModel 的单例,其中包含一些用于打开或创建其数据库文件的 Core Data 初始化代码。初始化后,这个单例使其 ManagedObjectContext 可用于应用程序中的各种屏幕,用于创建对象、显示对象表等。
我第一次打电话:
[StoriesModel sharedModel].context
它显然会失败。在 Objective C 中,解决这个问题的好模式是什么?我知道我可以在使用模型类之前对其进行第一次调用,但这并不总是有效。我以前的语言使用事件和数据绑定之类的东西来解决这个问题。我是多线程的新手。
这是标题的一些代码:
@interface StoriesModel : NSObject
+ (StoriesModel *)sharedModel;
@property (nonatomic,strong) NSManagedObjectContext *context;
@end
和实施:
@implementation StoriesModel
+ (StoriesModel *)sharedModel
{
static StoriesModel *sharedSingleton;
@synchronized(self)
{
if (!sharedSingleton)
{
sharedSingleton = [[StoriesModel alloc] init];
[sharedSingleton doInit];
}
return sharedSingleton;
}
}
- (void)doInit
{
// do some stuff that results in the context property being set in a few seconds
}
@end
谢谢,
格里
-- 修改后的上下文获取器示例:
- (NSManagedObjectContext *)context
{
if (!self.storyDatabase)
{
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"StoryDatabase"];
self.storyDatabase = [[UIManagedDocument alloc] initWithFileURL:url];
// if file doesn't exist create it
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.storyDatabase.fileURL path]])
{
[self.storyDatabase saveToURL:_storyDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success)
{
_context = self.storyDatabase.managedObjectContext;
[self populateSampleStories];
}];
}
// if file exists but is closed open it
else if (self.storyDatabase.documentState == UIDocumentStateClosed)
{
[self.storyDatabase openWithCompletionHandler:^(BOOL success)
{
_context = self.storyDatabase.managedObjectContext;
}];
}
// if file exists and is open use it
else if (self.storyDatabase.documentState == UIDocumentStateNormal)
{
_context = self.storyDatabase.managedObjectContext;
}
}
}