2016-03-22 12 views
0

JSONを取得した後にtableViewにデータを表示しようとしています。ただし、tableView.reloadData()を使用すると失敗します。私はメニューの遅延。swift NSURLSession POSTリクエスト後にデータをリロードするタイミングは何ですか?

私の状況では、tableViewはJSONを取得してから14〜20秒後にデータをリロードしますが、ユーザーがテーブルをアクティブにすると直ちにデータをリロードします。

スウィフト:

func getJson(word: String){ 
     let url: NSURL = NSURL(string: "MyPHP.php")! 
     let session = NSURLSession.sharedSession() 

     let request:NSMutableURLRequest = NSMutableURLRequest(URL:url) 
     request.HTTPMethod = "POST" 
     request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

     let bodydata = "label=\(word)" 
     request.HTTPBody = bodydata.dataUsingEncoding(NSUTF8StringEncoding) 

     if bodydata != " " { 

      let task = session.dataTaskWithRequest(request) { 
       (data, response, error) -> Void in 

       let httpResponse = response as! NSHTTPURLResponse 
       let statusCode = httpResponse.statusCode 

       if(statusCode == 200) { 

        self.libraryArray.removeAll() 
        do{ 
         let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 
         print(json) 
         if let book = json["Book"] as? [[String: AnyObject]]{ 
          for books in book { 
           if let BookName = book["Name"] as? [String: AnyObject] { 
            let name = BookName["name"] as? String 
            let author = BookName["author"] as? String 

            let bookDict = [ 
             "name": name, 
             "id": id, 
             "author": author] 

             self.libraryArray.append(bookDict) 
             self.tableView.reloadData() // has 14- 20 seconds delay, but the JSON has already received 

           } 
          } 
         } 
        }catch { 
         print("error:\(error)") 
        } 
       } 
      } 
      task.resume() 
      // self.tableView.reloadData() if i try to reload here, it will not be executed. 
     } 
    } 


@IBAction func Next(sender: AnyObject) { 
      self.getJson("someString") 
     //self.tableView.reloadData() if i try to reload here, it will be fail. 

     } 

遅延の問題は何ですか?どのようにそれを解決するには? tableViewをリロードするタイミングは?

答えて

0

jsonの解析を完了していない間に、テーブルをリロードするように要求しています。すべての本の解析後にそれを行います。あなたは解析を終えた後にそれを行うべきです。遅延の唯一の説明は、あなたが解析するためにすべての時間を取っている巨大なデータを持っているということです!それは可能ですか?

func getJson(word: String){ 
     let url: NSURL = NSURL(string: "MyPHP.php")! 
     let session = NSURLSession.sharedSession() 

     let request:NSMutableURLRequest = NSMutableURLRequest(URL:url) 
     request.HTTPMethod = "POST" 
     request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

     let bodydata = "label=\(word)" 
     request.HTTPBody = bodydata.dataUsingEncoding(NSUTF8StringEncoding) 

     if bodydata != " " { 

      let task = session.dataTaskWithRequest(request) { 
       (data, response, error) -> Void in 

       let httpResponse = response as! NSHTTPURLResponse 
       let statusCode = httpResponse.statusCode 

       if(statusCode == 200) { 

        self.libraryArray.removeAll() 
        do{ 
         let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 
         print(json) 
         if let book = json["Book"] as? [[String: AnyObject]]{ 
          for books in book { 
           if let BookName = book["Name"] as? [String: AnyObject] { 
            let name = BookName["name"] as? String 
            let author = BookName["author"] as? String 

            let bookDict = [ 
             "name": name, 
             "id": id, 
             "author": author] 

             self.libraryArray.append(bookDict) 
             self.tableView.reloadData() // has 14- 20 seconds delay, but the JSON has already received 

           } 
          } 
         } 
        }catch { 
         print("error:\(error)") 
        } 

        self.tableView.reloadData() // <<----- HERE 
       } 
      } 
      task.resume() 
      // self.tableView.reloadData() if i try to reload here, it will not be executed. 
     } 
    } 


@IBAction func Next(sender: AnyObject) { 
      self.getJson("someString") 
     //self.tableView.reloadData() if i try to reload here, it will be fail. 

     } 
+0

であなたのself.tableView.reloadData()を交換して申し訳ありませんが、あなたの方法は、すぐにデータを再ロードすることはできません。 –

1

この

dispatch_async(dispatch_get_main_queue(), {() -> Void in 

      self.tableView.reloadData() 

}) 
+0

ありがとうございました! –

+0

その私の喜び:) – iMuzahid