完成处理程序? async_dispatch?

时间:2016-12-11 20:24:03

标签: ios swift asynchronous parse-platform closures

这些是需要发生的方法和过程:

  1. 从Parse下载图片
  2. 下载相关数据(与图片匹配)
  3. 在地图上绘制此数据
  4. 这是我的代码来自视图加载:

        override func viewDidLoad() {
    
            imageDownload { () -> () in
                print("5-----inside closure")
                self.queryParseandSave(callback: self.plotImages)
            }
        }
    

    图像下载功能:

    func imageDownload(completed: @escaping FinishedDownload){
        print("1-----Started Image download")
    
        // Query for places
        let query = PFQuery(className:"ViewFinderObjects")
        query.whereKey("ImageVerified", equalTo: true)
        query.whereKey("coordinates", nearGeoPoint:myGeoPoint)
        query.limit = 10
        query.findObjectsInBackground { (objects, error) -> Void in
    
            if (error == nil) {
                for object in objects! {
                    print("2-----inside object for block")
                        let imageFromParse = object["image"] as! PFFile
                        imageFromParse.getDataInBackground(block: {(imageData, error) -> Void in
                            print("Searching for Image")
                            if error == nil {
                                let obsImage:UIImage = UIImage(data: imageData!)!
                                self.imageToShow = obsImage
                                self.closestImage.append(self.imageToShow!)
                                print("There are \(self.closestImage.count) images in the image array")
                            }
                        })
                        print("3-----Completed object loop")
                }
            }
    
            print("4-----Calling completed statement")
            completed()
        }
    }
    

    然后调用另一个函数queryParseandSave(callback: self.plotImages) 使用self.plotImages在地图上绘制图像。

    我有一个很大的问题:

    在图像下载完成之前,始终会调用<{self.plotImahes

    我研究过async_dispatch,但不知道这是否正确。

1 个答案:

答案 0 :(得分:0)

我不熟悉query.findObjectsInBackgroundimageFromParse.getDataInBackground方法的实现,但是它们的命名意味着它们都是异步发生的。同样从上面提供的内容来看,前者检索对象数据,而后者则执行实际的图像数据下载。如果确实如此,那么看起来你在第一个异步方法的主体内调用你的完成处理程序而不是等待第二个方法(看起来像是实际的图像)下载)。

关于如何解决这个问题的一些想法:

  1. 您可以将完成处理程序移动到imageFromParse.getDataInBackground块中,但只有在每个图像完成下载后,您才能多次调用完成块,这才有意义。
  2. 您可以创建自己的调度或操作队列,并等待所有任务完成,然后调用完成处理程序。
  3. 您可以设置一个观察者或通知模式,在适当的时候调用您的完成处理程序。
  4. 有许多不同的方法可以解决这个问题,但要记住的关键是,在所有异步操作完成后,你想要调用完成处理程序。现在,您在检索完对象后调用它,但在调用完成处理程序时,所有图像仍在后台下载。