GCD和核心数据

时间:2015-11-05 16:35:57

标签: ios swift core-data

我试图解决一个问题,即从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)")
    }

}

从Parse获取数据:

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

    }
}

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为findObjectsInBackgroundWithBlock进行网络呼叫,并且只有在网络呼叫完成后才异步执行其阻止。您的代码按以下顺序执行:

  1. 致电fetchFromParse()
  2. fetchFromParse()中,请致电Parse。 Parse下线并在后台与网络交谈......
  3. 致电fetchFromCoreData()
  4. 稍后,Parse会获得网络响应,然后执行您的阻止。
  5. 您应该期望异步网络通话始终需要很长时间,并且来自网络活动的回调将始终延迟到将来某个未知时间。意思是,你不能以某种方式移动到列表中前面的第4步。

    GCD不是这里的答案。您必须等到网络活动完成后才能处理Parse的结果。与此同时,您的应用需要具有响应能力,因此您不能只是等待这种情况发生。

    您需要做的是在Parse调用完成后重新执行Core Data fetch。如果您仍然显示先前提取的结果,则重新加载表视图是不够的。