2016-03-22 16 views
0

JSON'u aldıktan sonra tablodaki bazı verileri göstermeye çalışıyorum. Ancak, tableView.reloadData() kullanılarak başarısız oldu. Menü gecikmesi.swift NSURLSession POST isteğinden sonra verileri yeniden yükleme zamanlaması nedir?

Durumum, tabloView'in JSON'u alması 14-20 saniye sonra verileri yeniden yükleyeceğidir, ancak kullanıcı tabloyu etkinleştirdiğinde verileri hemen yeniden yükleyecektir.

Swift:

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. 

     } 

gecikme sorun nedir

? Nasıl çözeceksin? tableView öğesini yeniden yüklemek için doğru zamanlama nedir?

cevap

0

Tablonun ayrıştırılmasını tamamlamadan tablonun yeniden yüklenmesini istiyorsunuz. Bunu her Kitap ayrıştırmadan sonra yaparsınız. ayrıştırmayı bitirdikten sonra yapmalısın. Gecikmenin tek açıklaması, ayrıştırma için tüm zamanınızı alan çok büyük bir veriye sahip olmanızdır! Mümkün mü?

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

üzgün ile self.tableView.reloadData(), senin yöntem yeniden edemez verileri değiştirin. –

1

hemen bu

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

      self.tableView.reloadData() 

}) 
+0

Çok teşekkür ederim! –

+0

Benim zevkim :) – iMuzahid