iOS - 为什么在第一次应用程序加载时reloadData tableView数据?

时间:2016-03-26 02:22:35

标签: ios swift uitableview

我正在开发一个简单的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()

}

1 个答案:

答案 0 :(得分:3)

我不熟悉该API,但看起来fetchFlickrPhotos方法在后台线程上异步调用。这意味着应用程序的其余部分将不会等待它继续完成。 viewDidLoad将调用该方法,但继续前进而不等待它完成。

在下载完照片后,您提供的完成处理程序称为,根据照片的数量和大小,可能会在几秒钟后完成。因此,在实际下载照片后,需要reloadData来刷新表格视图。