リモートJSONデータでtableViewを作成したいとします。フェッチはfetchRecentPostsメソッドで行われ、viewDidLoadメソッドで呼び出されます。問題は、dataTaskWithRequestが非同期であり、テーブルビューがデータを待たないということです。私はWhat is the time delay between getting data and loading to UITableViewで、私はself.tableView.reloadData()をdispatch_asyncに書くべきだと読んだが、うまくいかなかった。SwiftでtableViewにリモートJSONデータを設定する
func fetchRecentPosts(){
let url = XAPI.recentPostURL()
let request = NSURLRequest(URL: url)
let task = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
let result = self.processRecentPostsRequest(data: data, error: error)
allPosts = result
print("session task complete")
}
dispatch_async(dispatch_get_main_queue(),{
self.tableView.reloadData()
})
task.resume()
}
問題は、dataTaskWithRequestがそのタスクを完了していないため、allPostsがnilであることです。
fatal error: unexpectedly found nil while unwrapping an Optional value
override func viewDidLoad() {
super.viewDidLoad()
fetchRecentPosts()
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return allPosts.count
}
ネットワークは非同期操作です。これを行う正しい方法は、 'dataTaskWithRequest'コールバックの中でデータを受け取った後にテーブルビューを設定することです。 –
タスクの完了ブロック内の 'dispatch_async'を移動します。 – rmaddy
まず、JSONオブジェクト、その配列オブジェクトまたは辞書を指定し、次にNSObjectモーダルクラスで解析します。 UItableViewをリロードした後、** allPosts **配列にこれらのオブジェクトを追加します。 –