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

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

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

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

TableViewController

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。在self.tableView.reloadData()中调用searchBarSearchButtonClicked不起作用。

最佳答案

将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()

09-06 01:04
查看更多