如何知道fetchRequest数据准备好了?

时间:2017-10-01 03:00:28

标签: swift core-data uicollectionview

我试了很多周才解决这个问题。

我的数据在另一个视图出现之前尚未就绪。

这是我的代码

FirstViewController.swift

let moc = DatabaseController.getContext()

moc.performAndWait {
   let fetchRequest:NSFetchRequest<Pet> = Pet.fetchRequest()
   fetchRequest.returnsObjectsAsFaults = true
   fetchRequest.sortDescriptors = [NSSortDescriptor(key: "order", ascending: false,selector: #selector(NSString.localizedStandardCompare(_:)))]

   self.petObj= try! fetchRequest.execute()
}

let VC = self.storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
VC.petObj = self.petObj

let navController = UINavigationController(rootViewController: VC)
navController.navigationBar.isHidden = true
self.present(navController, animated:true, completion: nil)

Click here to see my second view result

上面的结果你会看到错误和正确的输出

我通过添加

解决了这个问题
sleep(1)

在performAndWait结束之前,但我知道这不是处理这个问题的正确方法。

所以我的调查是获取数据尚未就绪。

1 个答案:

答案 0 :(得分:0)

使用fetchedResultsController。 fetchedResultsController执行提取,然后监视核心数据以进行任何更改(更新,删除,插入,移动)以告知UI更新。一般来说,我喜欢总是使用fetchedResultsController,而不是只做一个提取。以下是一些原因:

  1. fetchedResultsController将使您的视图与核心数据中的内容保持同步。因此,您很少会显示过时信息。由于核心数据的写入通常是后台线程,这是一个常见的问题。
  2. 删除核心数据对象后会导致崩溃。 ManagedObjects不像普通对象,强指针不足以保证它们将在内存中。如果从商店中删除实体,则访问该对象将导致崩溃。 FetchedResultsController监视删除,以便fetchedObjects属性始终可以安全访问
  3. 它们既便宜又容易。即使只是一个物体,也不要害怕使用它们。他们不占用大量资源。
  4. 它们适用于collectionViews和tableViews。它们被设置为具有与您的collectionView或tableViews匹配的indexPath。但是你不需要使用它们。它们可以匹配任何视图。只需确保在代表告诉您时根据需要更新它们。
  5. 但是有一些问题需要注意:

    1. 如果更改了相关对象,他们将不会更新。因此,如果您获取特殊类students中的所有ANY class.special == 1,如果类对象更新,它将不会更新,因为它只查看学生对象
    2. 正确更新tableview或collectionView可能会非常棘手。由于处理动作的方式很难更新视图。在这里看到我的答案:App crashes after updating CoreData model that is being displayed in a UITableView
    3. 希望有所帮助