ios - 完成处理程序?异步调度?

标签 ios swift asynchronous parse-platform closures

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

  • 从 Parse
  • 下载图像
  • 下载相关数据(与图像匹配)
  • 在 map 上绘制这些数据

  • 这是我从 View 中加载的代码:
        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在 map 上绘制图像。

    我有 1 个大问题:
    self.plotImahes总是在图像下载完成之前调用

    我研究了 async_dispatch 但不知道这是否是正确的做法。

    最佳答案

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

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

  • 您可以将完成处理程序移动到 imageFromParse.getDataInBackground block ,但这只有在每个图像完成下载后多次调用完成 block 时才有意义。
  • 您可以创建自己的调度或操作队列并等待所有任务完成,然后调用完成处理程序。
  • 您可以设置一个观察者或通知模式,在适当的时候调用您的完成处理程序。

  • 有许多不同的方法可以解决这个问题,但要记住的关键是,听起来您想在所有异步操作完成后调用完成处理程序。现在,您在检索对象后调用它,但是当调用完成处理程序时,您的所有图像仍在后台下载。

    关于ios - 完成处理程序?异步调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41090770/

    相关文章:

    c# - 'awaited'任务在哪里执行?

    iphone - 在设备上进行测试时向SIGABRT发出信号,它可在模拟器上运行。简易代码

    ios - 如何在 Swift 中从 GameScene 移动到 View Controller

    asynchronous - 如何使用 Warp 异步路由实现共享应用程序状态?

    ios - 如何将 Controller 传递给函数

    ios - 获取错误 : "Cannot convert value of type ' NSFetchRequest<NSManagedObject >' to expected argument type ' NSFetchRequest<NSFetchRequestResults >'"

    javascript - 如何在 for 循环中运行 mongoose 方法,因为 mongoose 函数是异步的

    ios - 错误线程 1 : Fatal error: Unexpectedly found nil while unwrapping an Optional value?

    ios - 应用内购买无法加载产品列表

    ios - presentingViewController 显示为 null