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()
}
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
})
}
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if error == nil {
DispatchQueue.main.async {
self.handleRequest(...)I
}
}
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
}
}
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