0

シングルトン パターンの UIManagedDocument を使用した Core Dataに関する Justin Driscoll の記事を使用して、UITabViewController 用にセットアップしています。シミュレーターでアプリを実行しています。初めて正常に動作します。データベースが正常に作成され、各タブのテーブル ビュー コントローラーにデータが表示されます。しかし、アプリケーションを再起動すると、NSFetchRequest がエンティティに対して 0 件の一致をフェッチするため、テーブルビューは空になります。同じフェッチ リクエストは、最初の実行時に正しい結果をフェッチします。

シミュレーターでアプリを停止する前に、データをロードし、データを自動保存しないという非同期の性質に関係していると思います。そのため、アプリの 2 回目の実行ではデータを利用できません。

コードに見られるように、データの読み込みを行っている方法。fetchDataIntoDocument メソッドは、データの初期ロードを行います。

// ドキュメント ハンドラー シングルトン クラス

 -(void) performWithDocument:(OnDocumentReady)onDocumentReady {

     void (^OnDocumentDidLoad)(BOOL) = ^(BOOL Success) {
              onDocumentReady(self.document);
     };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
        **[self fetchDataIntoDocument:self.document];**  
        [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);
    }
 }

 -(void)fetchDataIntoDocument:(UIManagedDocument *)document {

       MyEntityDataController *dc= [[MyEntityDataController alloc] init];
       NSDictionary *entityInfo  =[dc getEntityInfo];
       [document.managedObjectContext performBlock:^{
                 [Entity createEntityWithInfo:entityInfo   inManagedObjectContext:document.managedObjectContext];
       }];
 }

私の TableViewController クラス

 -(void)viewWillAppear:(BOOL)animated {

      [super viewWillAppear:animated];
      if (!self.databaseDocument) {
           [[LTDatabaseDocumentHandler sharedDatabaseDocumentHandler] performWithDocument:^    (UIManagedDocument *document) {
           self.databaseDocument = document;
           [self populateTableViewArrayFromDocument:self.databaseDocument];
           }];
      }
  } 

populateTableViewArrayFromDocument 内で、フェッチ要求を実行しています

  -(void)populateTableViewArrayFromDocument:(UIManagedDocument *)document
{
       NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity2"];
       NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
      [request setSortDescriptors:sortDescriptors];

     NSError *error = nil;
     NSArray *matches = [self.databaseDocument.managedObjectContext  executeFetchRequest:request error:&error];
     NSLog(@" matches count for Entity2 %d", matches.count);
     for (Entity2 *entity2 in matches) {
        //do stuff with data and add it to tableview array
     }
    }
4

1 に答える 1

1

あなたがこの問題を抱えている理由がわかったと思います。この問題に遭遇したばかりで、それを理解するためにいくつかの調査が必要でした。基本的に、あなたは正しいです。問題は実際、UIManagedDocument の非同期性にあります。ドキュメントがメモリに読み込まれるまで待ってから、フェッチを行う必要があります。

これは、ドキュメントの準備ができていることを確認するために使用するコードです。

 if ([[NSFileManager defaultManager] fileExistsAtPath:[_URLDocument path]]) {
        [_managedDocument openWithCompletionHandler:^(BOOL success){
            [self ready]
            if (!success) {
                // Handle the error.
            }
        }];
 } 

これが役に立てば幸いです、乾杯!

于 2013-08-28T21:13:03.297 に答える