2016-11-19 6 views
0

Core DataでサポートされているUITableViewがあります。fetchedObjectsはperformFetchの後はnilですが、tableViewにはデータがあります

私は今、表が空になったとき、私はrightBarButtonItemを無効にすることを機能を実装しています:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear: animated]; 

    self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO; 
} 

しかし、表にはアイテム、self.fetchedResultsController.fetchedObjects返すnilを持っているので、ボタンは常に無効になっている場合でも。

performFetchviewDidLoadと呼びます。

私はのviewDidLoad内でこのコードを試してみましたが、同じことが起こります。

self.fetchedResultsController.fetchedObjectsは、テーブルにデータが入力されていても何も表示されません。

EDIT

アイテムは、テーブルを表示する前に子コンテキストに即座に生成された多くのコードを追加しました。同じコンテキストがfetchRequestに使用されています。テーブルは子コンテキスト内の項目が移入されますので、

項目は、コンテキストに間違いなくあります。しかし、viewWillAppearを呼び出す場合、self.fetchedResultsController.fetchedObjectsはまだゼロです。

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
NSError *error = nil; 
if (![self.fetchedResultsController performFetch: &error]) 
{ 
     NSLog(@"Failed to perform fetch: %@", error); 
} 

dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
    }); 
    }); 

私はVCを表示する前にコンテキストを保存しています:

これは私が(viewDidLoadで)performFetchを呼び出す方法です。

+0

のようなあなたのdispatchBlockでself.fetchedResultsController.fetchedObjectsを呼び出してフェッチとnsmanagedObjectContext構成用のコードを追加してくださいしようとしています。 –

答えて

1

は、あなたがこの

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
NSError *error = nil; 
if (![self.fetchedResultsController performFetch: &error]) 
{ 
     NSLog(@"Failed to perform fetch: %@", error); 
} 

dispatch_async(dispatch_get_main_queue(), ^{ 
      self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO; 
      [self.tableView reloadData]; 
    }); 
    }); 
+0

うわー。テーブルを表示した後に 'fetchedObjects'が削除されるもう一つの理由があります。私は調査します。 'performFetch'コードは、スーパークラスであり、そしてないすべてのサブクラスがボタンを持っているので、私は私のコードビットをリファクタリングする必要がありますが、それは問題になることはありません。 'self.fetchedResultsController.fetchedObjects.count'を確認しています。これは、' fetchedObjects'が存在する可能性があるが空である可能性があるためです。 – Koen

+1

問題は非同期キュー内のデータを取得していて、時間がかかり、viewWillAppearで 'self.fetchedResultsController.fetchedObjects'を使用していて、結果がフェッチされていない可能性があります。 – Rajat

+0

はい、私もそれについて考えていました。しかし、テーブルにもデータが入力されるため、遅延は非常に短くなければなりません。私は実際にviewDidAppear' 'のコードを有効にするボタンを配置すると、それが働いていたが、その後、最初のビューが登場し、ボタンが良い見ていないされ、淡色表示されました。すべて今はうまく動作します。 – Koen

関連する問題