【问题标题】:This application is modifying the autolayout engine from a background thread, which can lead to engine corruption此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏
【发布时间】:2016-02-24 05:59:06
【问题描述】:

我收到此错误此应用程序正在从后台线程修改自动布局引擎,这可能会导致引擎损坏和奇怪的崩溃。这将在以后的版本中导致异常。我不'不知道是什么导致了这个错误。谁能帮帮我。

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()
 }

【问题讨论】:

标签: xcode multithreading swift


【解决方案1】:

dataTaskWithRequest 调用在后台运行,然后从同一线程调用您的完成处理程序。任何更新 UI 的东西都应该在主线程上运行,因此您当前的所有处理程序代码都应该在 dispatch_async 内返回到主队列:

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

斯威夫特 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
        })
    }

【讨论】:

    【解决方案2】:

    斯威夫特 3

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

    【讨论】:

      【解决方案3】:

      应该尝试符号断点来检测问题:-

      然后把你的 UI 更新代码放到主线程中

      DispatchQueue.main.async {}
      

      【讨论】:

      • 对我来说,我需要捕捉[CALayer layoutIfNeeded],因为我正试图从后台线程调用[myLayer renderInContext:context];
      • 调试时会不会严重导致app运行缓慢?
      【解决方案4】:

      你最好只在主线程中改变 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
              }
          }
      

      【讨论】:

        【解决方案5】:

        如果上述建议仍然没有让您满意,那么最可靠的方法是重新设计您的功能,以便获得您所需要的

         URLSession.shared.dataTask
        

        然后移交一个在该函数之外声明的变量,然后一个单独的 UIControl(按钮、滑动等)将其显示到标签或文本视图或其他任何东西。

        毕竟这就是错误消息告诉您的内容。他们是不同的关注点

        【讨论】:

          猜你喜欢
          • 2015-11-04
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多