2016-07-22 84 views
1

我的表格視圖在滾動時起伏不定,當它加載cellForItemAtIndexPath函數中的每個圖像時,我已經通過一些示例進行了搜索,這些是我嘗試過的和仍然有同樣的問題。UITableView在UITableView上滾動顯示URL的圖像

所以我有這個

var arrRes = [[String:AnyObject]]() 

然後內景做負載我做出Alamofire GET請求,並與swiftyJSON我保存JSON文件到上面的字典。

if let resData = swiftyJsonVar["events"].arrayObject { 
    self.arrRes = resData as! [[String:AnyObject]] 
} 
self.tableview2.reloadData() 




func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

    return 1 

} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return arrRes.count 
} 



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("mapCell", forIndexPath: indexPath) as! locationEventsTableViewCell 

    var dict = arrRes[indexPath.row] 

    cell.eventTitle.text = dict["eventName"] as? String 

    let cal = dict["eventStarttime"] as? String 



    let dateF = NSDateFormatter() 
    dateF.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
    let date:NSDate = dateF.dateFromString(cal!)! 


    let d = NSDateFormatter() 

    d.dateFormat = "dd-MM-yyyy HH:mm" 
    let d1 = d.stringFromDate(date) 
    cell.eventDate.text = d1 
    let at = dict["eventStats"]?["attendingCount"] as? Int 
    let kapa = at?.stringValue 
    cell.eventAttends.text = kapa 
    let imageDef : UIImage = UIImage(named: "noimage")! 


    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
    dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    if let theImage = dict["eventCoverPicture"] as? String { 

     let url = NSURL(string: theImage) 

     if url != nil { 
      let data = NSData(contentsOfURL: url!) 
      dispatch_async(dispatch_get_main_queue()) { 
      cell.eventImage.image = UIImage(data: data!) 

      } 

     } else { 
      cell.eventImage.image = imageDef 
     } 


    } 
    } 



    return cell 

} 

所以你可以看到我使用的調度異步函數來獲取圖像,即使我有和無的它仍然不流暢。

有沒有人有關於此的任何解決方案?謝謝!

回答

1

所以問題在於,每次顯示UITableView時都要從URL調用圖像。每次單元退出屏幕並返回時,它都會調用該方法從服務器中檢索圖像。

當UI嘗試執行時,服務器調用正在執行,這包括滾動和其他視覺負載。

根據應用程序的不同,您可以在加載tableView並將其存儲在本地之前下載UITableView的所有圖像。我也會調查NSCache,因爲這可能對您的應用程序更好。

目標是讓用戶界面始終成爲頭號優先事項。因此,如果您需要在UITableView中加入UITableView,請在載入UITableView之前加載它們或從內存中調用它們。

  1. 這可以確保您可以減少用戶網絡負載所需的最少量的服務器調用。

  2. 用戶界面中斷,用戶可以通過他們的應用程序滾動而不會發生這種瑣事。

+0

你說得對。這是一個長期的解決方案,雖然直到我找到如何做到這一點,但至少數據只在開始時加載一次,所以我想以一種好方法。雖然謝謝你的指導! –

+0

如果你不想在本地存儲,只是每次加載ViewController時加載它們,你可以使用'UIActivityIndi​​catorView'向用戶顯示你正在從服務器加載數據,然後才能正式呈現UITableView。 – ggworean

+0

您認爲在圖像實際顯示在單元格中之前顯示一個默認圖像(或加載圖像)是個不錯的主意?我想現在它變得更好了! –

1

我認爲你的代碼是正確的關於異步api。它可能是NSDateFormatter減慢你的速度。日期格式化程序是一個沉重的API。使用記憶,它也會提高性能。

class MyObject { 

    // define static variable 

    private static let formatter: NSDateFormatter = { 
     let formatter = NSDateFormatter() 
     formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy" 
     return formatter 
    }() 

    // you could use it like so 

    func someMethod(date: NSDate) -> String { 

     return MyObject.formatter.stringFromDate(date) 
    } 
}