2014-09-10 26 views
0

我從Parse中檢索一組圖像,使用下面的代碼使用Swift。從解析sdk中檢索Swift圖像 - 崩潰

var imageResources : Array<UIImage> = [] 
override func viewDidLoad(){ 
    super.viewDidLoad() 
    self.loadImages() 
} 

func loadImages(){ 

    var query = PFQuery(className: "Images") 
    query.orderByDescending("objectId") 

    query.findObjectsInBackgroundWithBlock ({(objects:[AnyObject]!, error: NSError!) in 
     if(error == nil){    

      for object : PFObject! in objects as [PFObject] {     

       var thumbNail = PFFile() 
       thumbNail = object["image"] as PFFile 
       println("thumNail \(thumbNail)") 
       thumbNail.getDataInBackgroundWithBlock({ 
        (imageData: NSData!, error: NSError!) in 
        if (error == nil) { 
         let image : UIImage = UIImage(data:imageData) 
         //image object implementation 
         self.imageResources.append(image) 
        } 

       })//getDataInBackgroundWithBlock - end 

      }//for - end 

     } 
     else{ 
      println("Error in retrieving \(error)") 
     } 

    })//findObjectsInBackgroundWithblock - end 


} 

我解析類的細節

類的名字 - 圖片 Parse class schema

當我運行這個功能,它變得不墜毀在控制檯的消息。

注意:我可以在回調中獲取PFFile對象的集合。

我已經更換 「thumbNail.getDataInBackgroundWithBlock({....」 與同步功能塊調用thumbNail.getData()之類 「變種的imageData = thumbNail.getData() VAR圖像= UIImage的(數據:爲imageData)」

然後錯誤說

警告:被主線程上執行的長期運行的操作 歇上warnBlockingOperationOnMainThread()來調試

所以,我回到了thumbNail.getDataInBackGroundWithBloack({... 但現在,控制檯中沒有顯示錯誤,就像之前發生的那樣。我的方法有什麼問題請告訴我。 任何幫助,將不勝感激......!

+0

當我嘗試將PFFile轉換爲UIImage,即(thumbNail.getDataInBackground({....)這就是問題出現的地方,對此的任何幫助都會非常棒 – Suresh 2014-09-10 13:15:17

+0

如果您發佈整個堆棧跟蹤 – 2014-09-10 13:21:54

+0

@TomErikStøwer:在我的控制檯中沒有堆棧跟蹤,它只是突然退出執行。 – Suresh 2014-09-11 05:23:35

回答

6

我設法重新創建錯誤,這似乎是PFObject上的某種內存泄漏/殭屍。我不知道確切原因,但重構您通過以下方式得到的代碼在我的情況下襬脫錯誤的:

func loadImages() { 

    var query = PFQuery(className: "Images") 
    query.orderByDescending("objectId") 


    query.findObjectsInBackgroundWithBlock ({(objects:[AnyObject]!, error: NSError!) in 
     if(error == nil){ 

      self.getImageData(objects as [PFObject]) 

     } 
     else{ 
      println("Error in retrieving \(error)") 
     } 

    })//findObjectsInBackgroundWithblock - end 


} 

func getImageData(objects: [PFObject]) { 
    for object in objects { 

     let thumbNail = object["image"] as PFFile 

     println(thumbNail) 

     thumbNail.getDataInBackgroundWithBlock({ 
      (imageData: NSData!, error: NSError!) -> Void in 
      if (error == nil) { 
       let image = UIImage(data:imageData) 
       //image object implementation 
       self.imageResources.append(image) 
       println(image) 
      } 

     })//getDataInBackgroundWithBlock - end 

    }//for - end 
} 

編輯:順便說一句,這也適用:

func loadImages() { 

    var query = PFQuery(className: "Images") 
    query.orderByDescending("objectId") 


    query.findObjectsInBackgroundWithBlock ({(objects:[AnyObject]!, error: NSError!) in 
     if(error == nil){ 

      let imageObjects = objects as [PFObject] 

      for object in objects { 

       let thumbNail = object["image"] as PFFile 

       thumbNail.getDataInBackgroundWithBlock({ 
        (imageData: NSData!, error: NSError!) -> Void in 
        if (error == nil) { 
         let image = UIImage(data:imageData) 
         //image object implementation 
         self.imageResources.append(image) 
         println(image) 
        } 

       })//getDataInBackgroundWithBlock - end 

      }//for - end 

     } 
     else{ 
      println("Error in retrieving \(error)") 
     } 

    })//findObjectsInBackgroundWithblock - end 


} 

這表明該誤差是由於下面的行:

for object : PFObject! in objects as [PFObject] { 

重寫該行如下:

for object : PFObject in objects as [PFObject] { 

也刪除錯誤。所以這個錯誤的原因似乎是,你告訴程序打開一些不是可選的東西。

+0

是的,用opti替換正常變量onal變量確實具有魔力。感謝TomErikStower !!!,你回答了我困擾了2天以上的問題。再次感謝:-) – Suresh 2014-09-11 08:52:57

+0

我不知道爲什麼人們會低估這個問題。我花了數小時調試相同的問題,找不到解決方案。非常感謝你。你能提供一些更多的信息,說明爲什麼解開它不是可選的會導致這樣的錯誤。 – zirinisp 2014-10-13 15:17:25

+0

不知道我理解你的問題@zirinisp。一個可選項與它所包裝的不同。因此,試圖解開不是可選的東西,只是沒有任何意義。這就像在一個沒有實現該方法的類型上調用aMethod()。 – 2015-03-31 20:29:06