web-dev-qa-db-ja.com

このアプリケーションは、バックグラウンドスレッドから自動レイアウトエンジンを変更しているため、エンジンが破損する可能性があります

このエラーが発生していますこのアプリケーションは、自動レイアウトエンジンをバックグラウンドスレッドから変更しているため、エンジンの破損や奇妙なクラッシュにつながる可能性があります。これにより、将来のリリースで例外が発生します。わからないこのエラーの原因です。誰でも私を助けることができます。

func getUserDataFromTwitterWithUser(user : PFUser)
 {
//NRLoader.showLoader()
let strTwURL = "https://api.Twitter.com/1.1/users/show.json?     screen_name="+PFTwitterUtils.Twitter()!.screenName! + "&access_token="+PFTwitterUtils.Twitter()!.authToken!
let twURL = NSURL (string: strTwURL)

let request = NSMutableURLRequest(URL: twURL!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 2.0) as NSMutableURLRequest

PFTwitterUtils.Twitter()?.signRequest(request)

let session = NSURLSession.sharedSession()

session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
  if error == nil {
    var  jsonOptional = Dictionary<String, AnyObject>()

    do {
      jsonOptional = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers ) as! Dictionary<String, AnyObject>
      // use jsonData
    } catch {
      // report error
    }
    var userName = ""
    if let screenName = jsonOptional["screen_name"] as? String{
      userName = screenName
    }
    else if let name = jsonOptional["name"] as? String{
      userName = name
    }

    var profilePicUrl = ""


    if let picUrl = jsonOptional["profile_image_url"] as? String{
      profilePicUrl = picUrl
    }
    AppUser.currentUser()?.username = userName
    AppUser.currentUser()?.profileAwsURL = profilePicUrl
    //NRLoader.hideLoader()
    //if ParseUtils.isLoggedInUserIsAnonymous() {
      let signUpVC:SignMeUpViewController = self.storyboard!.instantiateViewControllerWithIdentifier("SignMeUpViewController") as! SignMeUpViewController
      signUpVC.isFromLogin = true
      self.navigationController!.pushViewController(signUpVC, animated: true)

    //} else {
     // self.pushToSubmitDreamViewController()
    //}
  }
  else {
    //NRLoader.hideLoader()
    NRToast.showToastWithMessage(error!.description)
  }


}).resume()
 }
14
Ganesh Kumar

dataTaskWithRequest呼び出しはバックグラウンドで実行され、同じスレッドから完了ハンドラーを呼び出します。 UIを更新するものはすべてメインスレッドで実行する必要があるため、現在のハンドラーコードはすべてdispatch_async内にあり、メインキューに戻る必要があります。

dispatch_async(dispatch_get_main_queue()) {
  // Do stuff to UI
}

Swift 3:

DispatchQueue.main.async() {
  // Do stuff to UI
}

したがって、理想的には、現在if error == nil内にあるすべてのコードは、handleRequestと呼ばれる別の関数でオフにする必要があります。したがって、現在のコードは次のようになります。

session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
    if error == nil {
        dispatch_async(dispatch_get_main_queue(), {
            self.handleRequest(...)I
        })
    }
35
Michael

スイフト3

session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if error == nil {
    DispatchQueue.main.async {
        self.handleRequest(...)I
    }
}
16
Vimal Saifudin

問題を検出するには、シンボリックブレークポイントを試してください:- enter image description here

次に、UI更新コードをメインスレッドに配置します

DispatchQueue.main.async {}
7
Abdul Hameed

メインスレッドでのみUIを変更した方がよい

Swift3、

    let liveInfoUrl = URL(string: "http://192.168.1.66/api/cloud/app/liveInfo/7777")
    let task = URLSession.shared.dataTask(with: liveInfoUrl! as URL) {data, response, error in
        guard let data = data, error == nil else { return }
        DispatchQueue.main.async {
            print(String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) ?? "aaaa")

            //do some ui work
        }
    }
1
Kris Roofe

上記の提案がまだあなたに喜びを与えない場合、最も確実な方法は、あなたが必要なものを得るためにあなたの機能を再設計することです

 URLSession.shared.dataTask

次に、その関数の外部で宣言された変数を引き渡すと、別のUIControl(ボタン、スワイプなど)がラベルまたはテキストビューなどに表示します。

結局のところ、エラーメッセージが伝えていることです。彼らは別々の懸念です

0
aremvee