2015-11-16 87 views
1

我試圖從API獲取圖像,並使用Swift在UITableView中顯示它們。從api獲取圖像並在UIImageView中顯示它們swift

我設法準確地獲取所有屬性,但如果沒有特定對象(即餐廳)的圖像,我可能不會進行錯誤處理。這是因爲表視圖開始填充細一些圖像,然後彈了,出現以下錯誤:

fatal error: unexpectedly found nil while unwrapping an Optional value

請看看我的實現,讓我知道,如果我可以改變任何東西。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

    if let image = UIImage(data: NSData(contentsOfURL: NSURL(string: self.restaurants[indexPath.row].restaurantImage)!)!) { 

     dispatch_async(dispatch_get_main_queue()) {() -> Void in 
       cell.restaurantImage.image = image 
     } 
    } 
}) 

回答

1

當然您要訪問的可選當其值nil,你需要做的第一可選綁定來檢查,如果你想訪問的可能值不nil

根據AppleNSURLinit(string:)構造:

Returns an NSURL object initialized with URLString . If the URL string was malformed, returns nil .

,那麼你需要做的排在首位以下幾點:

if let url = NSURL(string: self.restaurants[indexPath.row].restaurantImage) { 

} 

然後下一個可選擇是UIImage的構造器根據Apple的等級:

Returns an NSURL object initialized with URLString . If the URL string was malformed, returns nil . So then you need to do the following code instead:

if let url = NSURL(string: self.restaurants[indexPath.row].restaurantImage) { 
    if let image = UIImage(data: NSData(contentsOfURL: url)) { 
    } 
} 

最後,你應該爲NSData類的failable構造函數可以返回nil過了,您的最終代碼相同的應該是這樣的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

    if let url = NSURL(string: self.restaurants[indexPath.row].restaurantImage) { 
     if let data = NSData(contentsOfURL: url) { 
      if let image = UIImage(data: data) { 
       dispatch_async(dispatch_get_main_queue()) {() -> Void in 
        cell.restaurantImage.image = image 
       } 
      } 
     } 
    } 
}) 

你總是反覆使用!操作一個可選的你對編譯器說你知道它的值不是nil,最好使用可選鏈來確保它不是nil

我希望這對你有所幫助。

+0

夢幻般的勝利者。可選的鏈接做到了這一點。謝謝。 –

+0

@ user2610863很高興爲您效勞 –

相關問題