35

アプリケーションをシミュレーターで実行しているときに、コンソールにこのログが表示されます。これは iOS 8 では見られませんでした。何が原因なのかよくわかりません。他の誰かが同じ問題に遭遇しましたか? もしそうなら、どのように修正されましたか? または、これに関して誰かが提供できる助けはありますか?

4

6 に答える 6

5

アプリのメイン スレッドに移動する必要があるすべての 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)
            })
        }
    }
于 2016-10-25T16:02:23.987 に答える
3

バックグラウンド スレッドから UI レイアウトを更新するコードがあります。コードを実行するオペレーション キューの変更は、明示的である必要はありません。たとえば、NSURLSession.shared() は、新しいリクエストを作成するときにメイン キューを使用しません。コードがメイン スレッドで確実に実行されるようにするために、NSOperationQueue の静的メソッド mainQueue() を使用しています。

迅速:

NSOperationQueue.mainQueue().addOperationWithBlock(){
    //Do UI stuff here
}

オブジェクト C:

[NSOperationQueue mainQueue] addOperationWithBlock:^{
    //Do UI stuff here
}];
于 2016-05-26T07:38:27.407 に答える
1

私の場合、同じ問題が発生しました。次の方法でコードを変更する必要があります。その後、正常に動作します。ではViewDidLoad、 を使用してこのメ​​ソッドを呼び出しますmain thread

[self performSelectorOnMainThread:@selector(setUpTableRows) withObject:nil waitUntilDone:YES];
于 2016-10-06T12:04:48.703 に答える