gpt4 book ai didi

ios - GCD和核心数据

转载 作者:行者123 更新时间:2023-11-30 13:56:34 27 4
gpt4 key购买 nike

我正在尝试解决从 CoreData 获取数据的执行时间早于从 Parse 检索数据并将其保存到 CoreData 的问题。如何实现一个队列来更早地从 Parse 获取数据?现在,当我启动应用程序时,数据库已更新,但它没有显示在 tableView 中。

CoreData检索数据:

func fetchFromCoreData() {

do {
let results = try context.executeFetchRequest(fetchRequest)

medicines = results as! [Medicine]
print("FetchFromCoreData")
tableViewMedicines.reloadData()

} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}

}

从解析中获取数据:

func fetchFromParse() {

let entity = NSEntityDescription.entityForName("Medicine", inManagedObjectContext: context)
let query = PFQuery(className: PFUser.currentUser()!.username!)
query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if error == nil {
for object in objects! {

if let name = object["medicineName"] as? String,
amount = object["amountQuantity"] as? String,
time = object["time"] as? String
{

let predicate = NSPredicate(format: "name = %@", name)
self.fetchRequest.predicate = predicate

do{
let fetchedEntities = try self.context.executeFetchRequest(self.fetchRequest) as! [Medicine]
//save to Core Data


if fetchedEntities.count <= 0 {
let medicine = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: self.context)
medicine.setValue(name, forKey: "name")
medicine.setValue(amount, forKey: "amount")
medicine.setValue(time, forKey: "time")

}

} catch let error as NSError{
print(error)
}
}
}

}

do {

try self.context.save()
print("Context.save")


} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
self.fetchFromCoreData()



}


}

我在 viewWillAppear 中调用它们:

override func viewWillAppear(animated: Bool) {
if Reachability.isConnectedToNetwork() {
//fetching data from Parse

fetchFromParse()
fetchFromCoreData()

tableViewMedicines.reloadData()

} else {

//fetching data from Core data
fetchFromCoreData()
logOutButton.enabled = false

}
}

最佳答案

发生这种情况是因为 findObjectsInBackgroundWithBlock 进行了网络调用,并且仅在网络调用完成后才异步执行其 block 。您的代码按以下顺序执行:

  1. 调用fetchFromParse()
  2. fetchFromParse()中,调用Parse。 Parse 关闭并在后台与网络对话...
  3. 调用fetchFromCoreData()
  4. 稍后的某个时刻,Parse 会收到网络响应,并且您的 block 会执行。

您应该预料到异步网络调用将始终花费很长时间,并且来自网络事件的回调将始终延迟到 future 的某个未知时间。这意味着,您无法以某种方式将上面的步骤 4 移到列表的前面。

GCD 不是这里的答案。您必须等到网络事件完成才能处理 Parse 的结果。与此同时,您的应用程序需要具有响应能力,因此您不能只是坐以待毙。

您需要做的是在 Parse 调用完成后重新执行核心数据获取。如果您仍然显示先前获取的结果,则重新加载 TableView 是不够的。

关于ios - GCD和核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com