1

すべて同じNSManagedObjectContextで動作するさまざまなコントローラーを備えたアプリケーションがあります。

私のアプローチは、AppDelegateでNSManagedObjectContextを初期化し、それをすべてのコントローラーに挿入することでした。

次のようにUIManagedDocumentを開いて、NSManagedObjectContextを初期化しています。

UIManagedDocument* databaseDoc = [[UIManagedDocument alloc] initWithFileURL:url];

if (![[NSFileManager defaultManager] fileExistsAtPath:[databaseDoc.fileURL path]]) {
    [databaseDoc saveToURL:databaseDoc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        myController.managedObjectContext = databaseDoc.managedObjectContext;
    }];
} else if (databaseDoc.documentState == UIDocumentStateClosed) {
    [databaseDoc openWithCompletionHandler:^(BOOL success) {
        myController.managedObjectContext = databaseDoc.managedObjectContext;
    }];
} else if (databaseDoc.documentState == UIDocumentStateNormal){
    myController.managedObjectContext = databaseDoc.managedObjectContext;
}

ここでの私の問題は、UIManagedDocumentを開くことが非同期で行われ、NSManagedObjectContextが完了ブロックでのみ使用可能になることです。

コントローラが常に有効なNSManagedObjectContextを使用できるようにするにはどうすればよいですか?もちろん、問題は起動時に発生します。つまり、コントローラーが「viewDidLoad」メソッドでNSManagedObjectContextを使用する必要があり、AppDelegateの完了ブロックがまだ実行されていない場合です...

1つのアプローチは、おそらくUIDocumentが開くまでAppDelegateで「待機」することですが、私が収集する限り、これはお勧めできません...

NSManagedObjectContextを開く非同期の性質を処理するコードでコントローラーを「汚染」することは避けたいのですが...これは単純な願いですか?

4

2 に答える 2

3

appDelegate で:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MyWaitViewController* waitController = [[MyWaitViewController new] autorelease];
    self.window.rootViewController =  waitController;

// then somewheres else, when you get your context
  [databaseDoc saveToURL:databaseDoc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        myContextController.managedObjectContext = databaseDoc.managedObjectContext;
        self.window.rootViewController    = myContextController;
        // note that at this point when the viewDidLoad method will get called
        // it will have his managedObjectContext and his view already available.
        // you can change your rootController, or push another viewController into the
 // stack. Depending on what u want from the GUI side

    }];
    return YES;
}

GUI ロジックを MyWaitViewController + AppDelegate 側に配置することに注意してください。ただし、コンテキストが存在する場合にのみ呼び出されたり作成されたりするため、「myContextController」をそのロジックコントロールから遠ざけてください。

于 2012-10-14T14:21:52.580 に答える
2

私は同じ問題に苦しんでいましたNSNotificationCenter.

  • 成功ハンドラーで初期化するときNSManagedObjectContextに、通知の送信を追加します。
  • 次に、viewDidLoad最初のものにリスナーを追加しますViewController

そのリスナーを使用してメソッドを呼び出しましたreloadData。重いアプリでは、これは問題になる可能性があります。これは、viewcontrollerが空白をロードしてからデータをリロードするviewControllerためmanagedObjectContextです。

于 2013-07-10T14:39:20.240 に答える