ios - 在 Swift 中从异步数据更新 TableView

标签 ios iphone json swift

我目前正在开发一个 iOS 应用程序,我最近遇到了同步下载和解析数据的问题,结果导致该应用程序完全没有响应。

我已经更新了我的代码以下载我的数据并异步解析它,但是我现在遇到了另一个问题。

我一直在尝试拆分我的代码并遵循 MVC 模式。我将 TableViewController 作为 TableView 的委托(delegate)和数据源。我有另一个类正在管理下载+解析我的数据。

我的问题是,一旦数据被解析 - 我该如何更新 TableView,因为它都是异步完成的。

表格 View Controller

func searchBarSearchButtonClicked(searchBar: UISearchBar) {
println(searchBar.text)

searchBar.resignFirstResponder() //Hide the keyboard

let result = ShowsDataParser.newSearchShows(searchBar.text) //Get search result based on input
searchResults = result.results
maxPages = result.maxPages
currentPage = 1
self.tableView.reloadData()
}

我也在这个类中实现了所有必需的方法(例如 cellForRowAtIndexPath)。

ShowsDataParser

class func newSearchShows(input: String, page:Int = 1) -> (results:[Show], maxPages: Int)
{
let searchUrl = "/search/tv" //Search URL
var searchResults = [Show]()
var totalPages = 1

let posterSize = "w92"

if let escapedSearch = escapeString(input) {
    var search = apiLocation + searchUrl + "?query=" + escapedSearch + "&api_key=" + APIKey + "&page=\(page)"

    if let url = NSURL(string: search)
    {
        let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler:{data,response,error -> Void in
            if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
            {
                var name: String
                var id: Int
                var status: String
                var overview = "meow"
                if let results = json["results"] as? NSArray
                {
                    for result in results
                    {
                        id = result["id"] as! Int
                        name = result["original_name"] as! String
                        //overview = result["overview"] as! String
                        status = ""
                        var newShow = Show(showId: id, showName: name, showDesc: overview, showStatus: status)
                        if let date = result["first_air_date"] as? String
                        {
                            newShow.firstAired = self.formatDate(date)
                        }
                        if let poster = result["poster_path"] as? String
                        {
                            if let baseUrl = AppDelegate.config?.baseUrl
                            {
                                if let data = NSData(contentsOfURL: NSURL(string: baseUrl + posterSize + poster)!)
                                {
                                    //newShow.posterImage = UIImage(data: data)
                                }
                            }
                        }
                        searchResults.append(newShow)
                    }
                }
                if let pages = json["total_pages"] as? Int
                {
                    totalPages = pages
                }
            }

        })
    }

}

return (results: searchResults, maxPages: totalPages)
}

如你所见,上面的类从指定的url获取并解析数据。我只是不确定完成此操作后如何更新 TableView 。在 searchBarSearchButtonClicked 中调用 self.tableView.reloadData() 无效。

最佳答案

将 reloadData() 调用放在 if 语句之后

if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
{ 

.... more code 

    if let pages = json["total_pages"] as? Int
    {
        totalPages = pages
    }
}
self.myTableView.reloadData()

关于ios - 在 Swift 中从异步数据更新 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31415721/

相关文章:

javascript - 如何在javascript for循环中创建一个json对象

javascript - 用javascript解析json坐标

c# - json 到 Windows 应用商店应用程序 C# 中的新列表框项目

iOS - 更改 iCloud 容器名称

ios - Firebase 电话号码身份验证错误

ios - 无法从 plist 获取内容到 UITableview

ios:关闭并推送 View Controller 一次执行

iphone - parent 的所有 child 的 NSFetchRequest

ios - 三指捏手势

iphone - "Program received signal "SIGABRT”构建计算器时