2016-12-11 163 views
0

這些都是需要發生的方法和過程:從解析完成處理程序? async_dispatch?

  1. 下載圖片
  2. 下載相關數據的地圖

這裏上(相匹配的圖像)

  • 情節此數據是我的代碼從視圖加載:

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

    圖像d ownload功能:

    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在地圖上繪製的圖像。

    我有1個巨大的問題:

    self.plotImahes前的圖像已經完成下載

    我已經研究async_dispatch,但不知道這是否是正確的事情總是被調用。

  • 回答

    0

    我並不熟悉query.findObjectsInBackgroundimageFromParse.getDataInBackground方法的實現,但他們的命名意味着它們都是異步發生的。還從上面提供的內容來判斷,前者檢索對象數據,而後者則執行實際的圖像數據下載。如果確實如此,那麼它看起來像在第一個第一個異步方法的主體內調用完成處理程序,而不是等待第二種方法(看起來像是實際的圖像下載)。

    一種如何解決這對夫妻的想法:

    1. 則可以將完成處理程序移動到imageFromParse.getDataInBackground塊,但如果你是舒服調用完成塊的多次這隻會意義,後每個圖像完成下載。
    2. 您可以創建自己的調度或操作隊列,並等待所有任務完成,然後然後調用完成處理程序。
    3. 您可以設置一個觀察者或通知模式,在適當的時候調用您的完成處理程序。

    有解決這個問題很多不同的方式,但需要記住的重要事情是,它聽起來像你想後打電話給你完成處理器所有的異步操作已經完成。現在你在檢索對象後調用它,但是當你的完成處理程序被調用時,你的所有圖像仍然在後臺下載。