2017-12-13 5 views
2

URLSessionがリクエストを送信し、応答を取得する前にiOSアプリがバックグラウンドモードになると、self.myLabel.textは更新を取得しますか?、DispatchQueue.mainは機能しますか?あなたはこのように行うことができますiOSアプリがバックグラウンドモードの場合、DispatchQueue.main?

func updateUILabel(callback :(NSDictionary?) -> Void){ 


    // create post request 
    let url = URL(string: "https:anyserver.xyz”)! 
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 

    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     DispatchQueue.main.async({ 
       guard let data = data, error == nil else { 
       print(error?.localizedDescription ?? "No data") 
       } 

       let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) 
       if let responseJSON = responseJSON as? [String: Any] { 
       self.myLabel.text = responseJSON[“text”] as! String 
       } 
     }) 
    } 

    task.resume() 
} 

答えて

2

func updateUILabel(callback :(NSDictionary?) -> Void){ 


    // create post request 
    let url = URL(string: "https:anyserver.xyz”)! 
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 

    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     DispatchQueue.main.async({ 
       guard let data = data, error == nil else { 
       print(error?.localizedDescription ?? "No data") 
       } 

       let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) 
       if let responseJSON = responseJSON as? [String: Any] { 
       //Update 
       DispatchQueue.main.async { 

         self.myLabel.text = responseJSON[“text”] as! String       

       } 

       } 
     }) 
    } 

    task.resume() 
} 

私はちょうどこの、この場合は

//Update 
       DispatchQueue.main.async { 

         self.myLabel.text = responseJSON[“text”] as! String       

       } 
+0

「DispatchQueue.main.async」は、URLSessionを呼び出した後すぐにバックグラウンドモードに入ると機能しますか?アプリがバックグラウンドモードになっている場合のメインスレッドの動作は何ですか? –

+0

はい私はコードを一度やりましたが、ベスト・プラクティスとして、アプリがバックグラウンドになるとUIを更新するのではなく、アプリがバックグラウンドにある間にそれらのデータを収集することができます。アプリがフォアグラウンドになると、また、アプリケーションがバックグラウンドにある間に応答文字列をNSUserDefaultに保存することもできます。アプリがフォアグラウンドになると、そのユーザーのラベルからラベルを更新することができます。ここでは、turoriaが役立ちます。https://www.raywenderlich.com/143128/バックグラウンドモード - チュートリアルを開始する –

1

ベストプラクティスを更新し、あなたは弱い自己代わりの強い自己を使用する必要があります。メモリリークや安全なアクセスを避けるために。 そして、コード更新UI用DispatchQueue.main.asyncを使用するだけで、私は[弱い自己]あなたの閉鎖前を追加して更新しています:)

func updateUILabel(callback :(NSDictionary?) -> Void){ 


    // create post request 
    let url = URL(string: "https:anyserver.xyz”)! 
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 

    let task = URLSession.shared.dataTask(with: request) {[weak self] data, response, error in 
      guard let data = data, error == nil else { 
       print(error?.localizedDescription ?? "No data") 
       return 
      } 
      let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) 
       if let responseJSON = responseJSON as? [String: Any] { 
       //Update 
       DispatchQueue.main.async { 

         self?.myLabel?.text = responseJSON[“text”] as? String       

       } 

       } 
     }) 
    } 

    task.resume() 
} 

自己?.myLabel?の.text = ...

リンゴ文書に続いて、バックグラウンドモードからのビューを更新しないでください。

"ウィンドウとビューの更新を避ける。アプリケーションがバックグラウンドのときにアプリケーションのウィンドウとビューが表示されないため、それらを更新しないでください。あなたのアプリのスナップショットを撮る前のウィンドウ。 リンク:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

+0

あなたは正しいです、私は[弱い自己]を追加しませんでした。バックグラウンドからラベルをどのように更新できますか? plz私に任意のリンクを与えてください.. –

+0

@ sulabhqg申し訳ありません私はあなたのバックグラウンドモードで任意のビューを更新する必要はありませんアップルの文書に従って、私の答えを更新しました。 "ウィンドウとビューを更新しないでください。アプリがバックグラウンドのときにアプリケーションのウィンドウとビューが表示されないため、更新しないでください。あなたのアプリのスナップショットを撮った。 リンク: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html –

関連する問題