2017-05-21 2 views
0

リモート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 
} 
+0

ネットワークは非同期操作です。これを行う正しい方法は、 'dataTaskWithRequest'コールバックの中でデータを受け取った後にテーブルビューを設定することです。 –

+0

タスクの完了ブロック内の 'dispatch_async'を移動します。 – rmaddy

+0

まず、JSONオブジェクト、その配列オブジェクトまたは辞書を指定し、次にNSObjectモーダルクラスで解析します。 UItableViewをリロードした後、** allPosts **配列にこれらのオブジェクトを追加します。 –

答えて

0

あなたは少しハックして逃げることができるかもしれません。

numberOfRowsInsectionメソッドでは、allPosts.countの数をチェックし、0の場合(データがない場合)は0を返し、それ以外の場合はカウントを返します。

cellForRowAtIndexPath代理人では、allPostsに何かがあるかどうかに応じてビューを調整することができます。

セルにxibファイルを使用することをお勧めします。LoadingCell.xibPostCell.xibがあり、それに応じてロードすることができます。

このようにして、データが設定される前にビューがロードされると、データがロードされていることを示す素晴らしいメッセージが表示されます。

+0

これはあまり意味がありません。 'allPosts.count'が' 0'ならば '0'を返すと、ゼロであるかどうかにかかわらず' return allPosts.count'だけが必要です。 '0'を返すと、' cellForRowAt'は呼び出されないので調整する必要はありません。 – rmaddy

関連する問題