2015-10-18 118 views
0

我想从api web服务异步加载图像到iOS 9的swift中的uitableview。下面是我的播放列表控制器的代码。提前致谢。Swift将字符串转换为UIIMAGE

import UIKit 

class PlaylistViewController: UITableViewController { 

var playlists = [[String: String]]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let urlString = "http://xxxxxxx.xxx/api/v1/players/1/playlists?api_key=xxxxxxxxxxxx" 

    if let url = NSURL(string: urlString) { 

     if let data = try? NSData(contentsOfURL: url, options: []) { 
      let json = JSON(data: data) 


      if json != nil { 
       parseJSON(json) 
      } else { 
       showError() 
      } 
     } else { 
      showError() 
     } 
    } else { 
     showError() 
    } 
} 

func showError() { 
    let ac = UIAlertController(title: "Loading error", message: "There was a problem loading the feed; please check your connection and try again.", preferredStyle: .Alert) 
    ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
    presentViewController(ac, animated: true, completion: nil) 
} 

func parseJSON(json: JSON) { 
    for result in json["playlists"].arrayValue { 
     let title = result["title"].stringValue 
     let id = result["id"].stringValue 
     let cover_url = result["cover_url"].stringValue 
     let obj = ["title": title, "id": id, "cover_url" : cover_url] 
     playlists.append(obj) 
    } 

    tableView.reloadData() 
} 
+0

的NSData(contentsOfURL:URL,选项:[])它不是异步的。你应该使用NSURLSession的dataTaskWithURL –

回答

1

使用NSURLSession dataTaskWithURL用于异步任务:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let urlString = "http://xxxxxxx.xxx/api/v1/players/1/playlists?api_key=xxxxxxxxxxxx" 

    if let url = NSURL(string: urlString) { 

     let session = NSURLSession.sharedSession() 
     var task = session.dataTaskWithURL(url) { (data, response, error) -> Void in 

      if let err = error { 
       showError(err) 
      } else { 
       let json = NSString(data: data, encoding: NSUTF8StringEncoding) 
       // json is a String, you should handle this String as JSON 
       parseJSON(json) 
      } 
    } 
} 

tableView.reloadData()应该在主线程中执行(因为NSURLSession dataTaskWithUrl结果是在后台线程)

dispatch_async(dispatch_get_main_queue(), { 
    tableView.reloadData() 
})