2016-12-03 32 views
0

我需要每20秒更新一次UILabel文本。 這裏一切正常,但我的UILabel不會改變。爲什麼我的UILabel文本在Xcode 8.1中不會在Swift3中更改

數據從URL和短語也正確加載。當我嘗試 self.team1Score = "1"viewDidLoad然後它的工作。

請看看我的代碼,並建議我如何每20秒更換UILabel文字。

import UIKit 

class WatchLiveVideo: UIViewController { 

    @IBOutlet var team1Score: UILabel! 
    @IBOutlet var team2Score: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.getScore() 
     //run getScore in every 20 Seconds 
     _ = Timer.scheduledTimer(timeInterval: 20, target: self, selector: #selector(WatchLiveVideo.self.getScore), userInfo: nil, repeats: true) 
    } 

    func getScore() 
    { 
     let myUrl = URL(string: "http://myurl.com"); 
     var request = URLRequest(url:myUrl!) 

     request.httpMethod = "POST"// Compose a query string 

     //input data bind to send server 
     let streamID = getStreamID 

     let postString = "streamID=\(streamID)" 

     request.httpBody = postString.data(using: String.Encoding.utf8) 

     let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 

      if error != nil 
      { 
       print("error=\(error)") 
       return 
      } 

      do { 
       let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

       if let parseJSON = json { 
        let status = parseJSON["status"] as? String 
        let team1 = parseJSON["team1"] as? String 
        let team2 = parseJSON["team2"] as? String 

        if(status == "1") 
        { 
         self.team1Score.text = team1 
         self.team2Score.text = team2 
        } 
        else if(status == "0") 
        { 
         print("No Score Found") 
        } 
       } 
      } catch { 
       print(error.localizedDescription) 
      } 
     } 
     task.resume() 
    }  

} 
+0

你試過在主隊列調度self.team1Score.text = TEAM1? – Adamsor

+0

嗨Adamsor,謝謝你的回覆。是我嘗試與DispatchQueue.main.async(){ self.team1Score.text = self.team1 self.team2Score.text = self.team2 }在ViewDidLoad –

+0

「當我嘗試self.team1Score =」1「在ViewDidLoad然後工作。「怎麼會這樣? –

回答

1

URLSession任務的完成塊在後臺線程上運行。

您不能在後臺線程中對UIKit對象進行顯示更改。你目前的代碼是這樣做的,這是行不通的。

您需要在呼叫包中的代碼你完成塊像self.team1Score.text = team1DispatchQueue.main.async()

+0

我做到了,但沒有成功 –

2

您需要在主線程中更新UI。因此,嘗試你的包裹標籤的更新代碼如下,以便它運行的主線程:

DispatchQueue.main.async { 
     self.team1Score.text = team1 
     self.team2Score.text = team2  
} 

我也只是增加了一個demo project說明你,我提供答案的作品。我剛剛舉了一個例子,看起來像你提供的代碼。我已經每隔20秒鐘對公共休息服務進行遠程調用,並更新了主隊列中的標籤,就像我上面提到的那樣。你可以下載並運行應用程序,看看它是否工作。

+1

您的回答是正確的,但您提供了Swift 2語法。 OP詢問Swift 3.在swift 3中,調用是'DispatchQueue.main.async()'。 –

+0

@DuncanC是的,你是對的。我正在對您的評論進行編輯。 – alptugd

+0

您可能想要限定您的答案,以說「對URLSession的completionHandler的調用在後臺線程上運行,因此完成處理程序中的任何UI代碼都需要被包裝......」正如所寫的,新手可能認爲您在說所有的UI代碼需要在GCD調用中包裝到主隊列中。 –

相關問題