Gan*_*mar 14 xcode multithreading swift
我收到此错误此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃.这将导致未来版本中的异常.我不知道是什么导致了这个错误.有谁能够帮我.
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()
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*ael 35
该dataTaskWithRequest呼叫在后台运行,然后调用在同一个线程的完成处理程序.更新UI的任何内容都应该在主线程上运行,因此所有当前的处理程序代码都应该在dispatch_async主队列的后面:
dispatch_async(dispatch_get_main_queue()) {
// Do stuff to UI
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特3:
DispatchQueue.main.async() {
// Do stuff to UI
}
Run Code Online (Sandbox Code Playgroud)
因此,理想情况下,您当前拥有的所有代码都if error == nil应该在另一个函数中关闭,例如调用handleRequest,因此您当前的代码变为:
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if error == nil {
dispatch_async(dispatch_get_main_queue(), {
self.handleRequest(...)I
})
}
Run Code Online (Sandbox Code Playgroud)
Vim*_*din 16
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if error == nil {
DispatchQueue.main.async {
self.handleRequest(...)I
}
}
Run Code Online (Sandbox Code Playgroud)
应该尝试Symbolic Breakpoint来检测问题: - 
然后将您的UI更新代码放在主线程中
DispatchQueue.main.async {}
Run Code Online (Sandbox Code Playgroud)