5

私はこのブログを使用しています: http://www.adevelopingstory.com/blog/2012/03/core-data-with-a-single-shared-uimanageddocument.htmlシングルトンのシングルトンを作成しますUIManagedDocument。関連するコードは次のとおりですBetterDatabase

//In BetterDatabase

typedef void (^OnDocumentReady) (UIManagedDocument *document);

- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
    void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success) {
        onDocumentReady(self.document);
    };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
        [self.document saveToURL:self.document.fileURL
                forSaveOperation:UIDocumentSaveForCreating
               completionHandler:OnDocumentDidLoad];
    } else if (self.document.documentState == UIDocumentStateClosed) {
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    } else if (self.document.documentState == UIDocumentStateNormal) {
        OnDocumentDidLoad(YES);
    }
}

//In other class
[[BetterDatabase sharedDocumentHandler] performWithDocument:^(UIManagedDocument * document) {
        //Do stuff 1
        //Do stuff 2
}];

私の質問: いつ UIManagedDocument を自動的に閉じることができますか? つまり、スタッフ 1 とスタッフ 2 の間でドキュメントが (OS/SDK によって) 閉じられる可能性はありますか? ユーザーが iPhone アプリを最小化してから再度開くとどうなりますか? UIManagedDocument閉鎖されますか?

これを別の言い方をすると、次のようになりますUIManagedDocument

4

1 に答える 1

4

最初の質問、いつ UIManagedDocument を自動的に閉じることができますか? 「iOSが適切と判断した場合」という簡単な答えがあります。つまり、これがいつ発生するかを制御することはできません (自分で閉じない限り、それは重要ではありません)。しかし、あなたはまだこの状況に対応することができます。

特に、AppDelegate ファイルでは、ドキュメントを保存する行を含めることができます。

- (void)applicationWillResignActive:(UIApplication *)application

(UIManagedDoc を使用する場合は必要ありません)

ここで説明されているように、アプリは UIManagedDocument の状態の変化も監視する必要があります。

2 番目の質問に対する答えは YES です。例:バックグラウンド操作が長く、ユーザーが電話をシャットダウンした場合、ドキュメントは閉じられます。UIManagedDocument を操作しているため、保存は自動的に行われるため、一貫性のない状態になることを心配する必要はありません。

アプリがバックグラウンド状態になり、stuff1 と stuff2 の間にあるものがアプリにとって重要な場合 (新しいデータの入力など)、最も重要な部分をバックグラウンド タスクにまとめることを検討する必要があります。

前の状態から復元する 3 番目の質問は、実際にはアプリに依存します。Apple は多くのドキュメントを発行しています。これは、競合を含む UIManagedDocument 状態の変化への適切な応答と組み合わせて使用​​する必要があります。

最後の質問に対する答えは、通常の状態では NO であり、それ以外の場合は YES です。アプリがフォアグラウンドにある場合でも、メモリ不足、電話のシャットダウンなどです。

したがって、本質的には、アプリがいつ終了するかを制御することはできませんが (バッテリーが消耗したり、OS がシャットダウンしたりしますか?)、データを保持できる方法で UIManagedDocument の変更やアプリのライフサイクルの変更に対応することはできます。威厳。

編集:ありがとう、それがあなたの質問に完全に答えたとは思わなかった. 念のため、元の質問で参照している投稿は、重要な問題を解決するのに非常に適しています。特に、私はそれをほぼ逐語的に取り、独自の通知を追加して、いつ、どのように更新する必要があるかをビューに伝えました。Apple の DataSource メカニズムに依存することは常に良いとは限りません。トラブルシューティングが非常に困難な競合状態につながる場合があるためです (たとえば、ビューが表示されていないときにビューを更新する必要があります..)。

したがって、2つの方法では

- (void)objectsDidChange:(NSNotification *)notification
{
#ifdef DEBUG
    NSLog(@"NSManagedObjects did change.");
#endif
}

- (void)contextDidSave:(NSNotification *)notification
{
#ifdef DEBUG
    NSLog(@"NSManagedContext did save.");
#endif
}

通知のユーザー情報フィールドは、ドキュメントで何が行われたかを示します。例:

userInfo = {
    inserted = "{<the Core data fields inserted>}";
    updated = "{<code data fields updated>}";
}}

そして、私が適切だと思うようにビューを更新します。たとえば、リモート サーバーから新しいデータを受信した場合、挿入された新しいフィールドの数をカウントし、バッジ カウントを更新できます。または、1 つのビューのみが更新されるように通知を送信するなど.

UIManagedDoc を使用してビュー間のデータの一貫性を処理することは難しくありませんが、副作用を発生させずにデータを更新する方法は非常に難しいことが明らかになりました。

幸運を !

于 2013-04-13T15:47:10.780 に答える