初めて使用するときまでに初期化が完了していない可能性があるシングルトンへのアクセスの管理について質問があります。データベース ファイルを開いたり作成したりするための Core Data 初期化コードを含む StoriesModel というシングルトンを作成しました。初期化後、このシングルトンはその ManagedObjectContext をアプリ内のさまざまな画面で使用できるようにし、オブジェクトの作成、オブジェクトのテーブルの表示などを行います。
私が初めて電話したとき:
[StoriesModel 共有モデル].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;
}
}
}