我正在开发一个简单的Flickr应用程序,它从API获取一些数据并将其显示在tableview实例上。这是TableViewController子类的一段代码。
var photos = [FlickrPhotoModel]()
override func viewDidLoad() {
super.viewDidLoad()
getFlickrPhotos()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
private func getFlickrPhotos() {
DataProvider.fetchFlickrPhotos { (error: NSError?, data: [FlickrPhotoModel]?) in
//data is received
dispatch_async(dispatch_get_main_queue(), {
if error == nil {
self.photos = data!
self.tableView.reloadData()
}
})
}
}
如果删除{tableView.reloadData()}行,应用程序似乎不会加载数据。有谁知道为什么会发生这种情况,因为我在viewDidLoad()中调用了getFlickrPhotos()。我相信我也在适当的地方从后台线程调度。请让我知道我做错了什么。
编辑 - 数据提供者代码
class func fetchFlickrPhotos(onCompletion: FlickrResponse) {
let url: NSURL = NSURL(string: "https://api.flickr.com/services/rest/?method=flickr.photos.getRecent&api_key=\(Keys.apikey)&per_page=25&format=json&nojsoncallback=1")!
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
if error != nil {
print("Error occured trying to fetch photos")
onCompletion(error, nil)
return
}
do {
let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
let photosContainer = jsonResults!["photos"] as? NSDictionary
let photoArray = photosContainer!["photo"] as? [NSDictionary]
let flickrPhoto: [FlickrPhotoModel] = photoArray!.map{
photo in
let id = photo["id"] as? String ?? ""
let farm = photo["farm"] as? Int ?? 0
let secret = photo["secret"] as? String ?? ""
let server = photo["server"] as? String ?? ""
var title = photo["title"] as? String ?? "No title available"
if title == "" {
title = "No title available"
}
let model = FlickrPhotoModel(id: id, farm: farm, server: server, secret: secret, title: title)
return model
}
//the request was successful and flickrPhoto contains the data
onCompletion(nil, flickrPhoto)
} catch let conversionError as NSError {
print("Error parsing json results")
onCompletion(conversionError, nil)
}
}
task.resume()
}
答案 0 :(得分:3)
我不熟悉该API,但看起来fetchFlickrPhotos
方法在后台线程上异步调用。这意味着应用程序的其余部分将不会等待它继续完成。 viewDidLoad
将调用该方法,但继续前进而不等待它完成。
在下载完照片后,您提供的完成处理程序称为,根据照片的数量和大小,可能会在几秒钟后完成。因此,在实际下载照片后,需要reloadData
来刷新表格视图。