web-dev-qa-db-fra.com

Cette application modifie le moteur d'autolayout à partir d'un thread en arrière-plan, ce qui peut entraîner une corruption du moteur.

Je reçois cette erreur Cette application modifie le moteur autolayout à partir d'un thread en arrière-plan, ce qui peut entraîner une corruption du moteur et des plantages étranges. Cela provoquera une exception dans une version ultérieure. Je ne sais pas ce qui cause cette erreur. Quelqu'un peut-il m'aider?.

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

L'appel dataTaskWithRequest s'exécute en arrière-plan, puis appelle votre gestionnaire d'achèvement à partir du même thread. Tout ce qui met à jour l'interface utilisateur doit être exécuté sur le thread principal, de sorte que tout le code de votre gestionnaire actuel doit se trouver dans un dispatch_async dans la file d'attente principale:

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

Swift 3:

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

Par conséquent, idéalement, tout le code que vous avez actuellement dans if error == nil devrait être désactivé dans une autre fonction, appelée par exemple handleRequest, afin que votre code actuel devienne:

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

Swift 3

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

Devrait essayer Symbolic Breakpoint pour détecter le problème: -  enter image description here

Ensuite, mettez votre code de mise à jour de l'interface utilisateur dans le fil principal

DispatchQueue.main.async {}
7
Abdul Hameed

Vous feriez mieux de changer l'interface utilisateur uniquement dans le fil principal

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

si les suggestions ci-dessus ne vous procurent toujours pas de joie, le moyen le plus sûr est de redéfinir vos fonctions de manière à obtenir ce dont vous avez besoin avec

 URLSession.shared.dataTask

transmet ensuite une variable déclarée en dehors de cette fonction, puis un UIControl distinct (bouton, balayage, etc.) l’affiche sur une étiquette, une vue en texte ou autre.

Après tout, c’est ce que vous dit le message d’erreur. ils sont des préoccupations distinctes

0
aremvee