アプリケーションをシミュレーターで実行しているときに、コンソールにこのログが表示されます。これは iOS 8 では見られませんでした。何が原因なのかよくわかりません。他の誰かが同じ問題に遭遇しましたか? もしそうなら、どのように修正されましたか? または、これに関して誰かが提供できる助けはありますか?
6 に答える
アプリのメイン スレッドに移動する必要があるすべての UI パーツの更新。
createMenuView()をバックグラウンドで呼び出していたところ、以下のエラーが発生しました
「このアプリケーションは、自動レイアウト エンジンをバックグラウンド スレッドから変更しています。これにより、エンジンの破損や異常なクラッシュが発生する可能性があります」
だから私は上記のメソッドをメインスレッドに呼び出しました
DispatchQueue.main.async {
}
SWIFT 3.0 および Xcode 8.0 で
以下に書かれた正しいコード:
RequestAPI.post(postString: postString, url: "https://www.someurl.com") { (succeeded: Bool, msg: String, responceData:AnyObject) -> () in
if(succeeded) {
print(items: "User logged in. Registration is done.")
// Move to the UI thread
DispatchQueue.main.async (execute: { () -> Void in
//Set User's logged in
Util.set_IsUserLoggedIn(state: true)
Util.set_UserData(userData: responceData)
self.appDelegate.createMenuView()
})
}
else {
// Move to the UI thread
DispatchQueue.main.async (execute: { () -> Void in
let alertcontroller = UIAlertController(title: JJS_MESSAGE, message: msg, preferredStyle: UIAlertControllerStyle.alert)
alertcontroller.title = "No Internet"
alertcontroller.message = FAILURE_MESSAGE
self.present(alertcontroller, animated: true, completion: nil)
})
}
}
バックグラウンド スレッドから UI レイアウトを更新するコードがあります。コードを実行するオペレーション キューの変更は、明示的である必要はありません。たとえば、NSURLSession.shared() は、新しいリクエストを作成するときにメイン キューを使用しません。コードがメイン スレッドで確実に実行されるようにするために、NSOperationQueue の静的メソッド mainQueue() を使用しています。
迅速:
NSOperationQueue.mainQueue().addOperationWithBlock(){
//Do UI stuff here
}
オブジェクト C:
[NSOperationQueue mainQueue] addOperationWithBlock:^{
//Do UI stuff here
}];
私の場合、同じ問題が発生しました。次の方法でコードを変更する必要があります。その後、正常に動作します。ではViewDidLoad
、 を使用してこのメソッドを呼び出しますmain thread
。
[self performSelectorOnMainThread:@selector(setUpTableRows) withObject:nil waitUntilDone:YES];