Это приложение модифицирует механизм автозапуска из фонового потока, что может привести к повреждению двигателя
Я получаю эту ошибку Это приложение модифицирует механизм автозапуска из фонового потока, что может привести к повреждению двигателя и странным сбоям. Это приведет к исключению в будущей версии. t знать, что вызывает эту ошибку. Кто-нибудь может мне помочь.
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()
}
Ответы
Ответ 1
Вызов dataTaskWithRequest
выполняется в фоновом режиме, а затем вызывает обработчик завершения из того же потока. Все, что обновляет пользовательский интерфейс, должно работать в основном потоке, поэтому весь ваш текущий код обработчика должен находиться в пределах 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
})
}
Ответ 2
Swift 3
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if error == nil {
DispatchQueue.main.async {
self.handleRequest(...)I
}
}
Ответ 3
Попробуйте Symbolic Breakpoint для обнаружения проблемы: - ![введите описание изображения здесь]()
Затем поместите код обновления UI в основной поток
DispatchQueue.main.async {}
Ответ 4
Лучше изменить интерфейс только в основном потоке
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 (кнопка, swipe и т.д.) выводит ее на ярлык или текстовое представление или что-то еще.
После всего этого вам сообщается сообщение об ошибке. они являются отдельными проблемами