此應用程式是由一個背景線程修改布局的發動機,進而導緻發動機的腐敗和怪異的崩潰
轉自:http://translate.baiducontent.com/transpage?query=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F31951704%2Fthis-application-is-modifying-the-autolayout-engine-from-a-background-thread-wh&from=en&to=zh&source=url&origin=ps
了投票 二十四 投票表決 收藏夾
六
我把這個日志在控制台當我運作我的應用程式在模拟器。沒有在iOS 8中看到這個。我不知道是什麼造成了這。有其他人遇到同樣的問題,那麼它是如何固定?或是沒有任何幫助的任何人都可以提供關于這個嗎? iPhone ios9 xcode7-beta4 分享 改善這個問題 | 問 15年8月11日在20:51 shabarinath pabba 二百九十二 二 三 十三 | |
添加評論 |
5個答案
活動中 最老的 投票
了投票 四十七 投票表決 認可的 | 不改變任何東西但UI主線程。雖然它可能似乎工作的一些作業系統或裝置而不是别人,勢必會使你的應用程式不穩定和不可預知的,崩潰。 如果你必須響應一個通知,這可以發生在背景,然後確定 UIKit 調用發生在主線程。 你至少有這2個選項: 異步排程 使用 GCD (Grand Central Dispatch)如果你的觀察者可以在任何線程通知。你可以聽任何線程中做工作,并封裝在使用者界面的變化 dispatch_async : dispatch_async(dispatch_get_main_queue()){
/做UI的東西
}
當使用 GCD ?當你不控制誰發送的通知。它可以是作業系統,一個cocoapod,嵌入式圖書館等使用 GCD 随時會醒來,每次。缺點:你會發現自己重新安排工作。 聽上主線程 友善,你可以指定在哪個線程要觀察被通報,在你注冊的時候通知,使用 隊列 參數: addobserverforname:@“通知”
對象:零
隊列:[ nsoperationqueue mainqueue ]
usingblock:^(通知*注){
/做UI的東西
}
當<em>觀察主線程</em>?當你都注冊和注冊。但你回應的通知,你已經在你需要在的地方。 後通知主線程 【自performselectoronmainthread:@選擇器(postnotification:)結合:通知waituntildone:沒有];
混合溶液,<strong>不保證</strong>,觀察員隻調用從表示方法。它允許觀察者在輕,成本較低的穩健設計。這裡隻提到作為一個解決方案,<em>你應該避免</em>。 分享 提高這個答案 | 編輯15年9月17日在16:26 | 回答 15年8月11日在21:13 swiftarchitect 18.1k 七 六十一 九十五 | |
| 是以我們做了一對夫婦在UI更新時,我們聽到一個通知,你是說我需要讓那些更新裡面的“dispatch_async(dispatch_get_main_queue()”?– shabarinath pabba 15年8月11日在21:16 | | 确切地.我說的例子。– swiftarchitect 15年8月11日在21:24 | | 好了,現在你的努力會選擇作為一個答案如果是固定的:D– shabarinath pabba 15年8月11日在21:27 | | 為什麼這不需要iOS 8嗎?,為什麼這在iOS 9發生?– shabarinath pabba 15年8月11日在21:29 | | 這是最好的實踐在iOS 8蘋果剛剛選擇iOS 9開始不更新,預警,為錯誤狀态,将很快被禁止更新背景線程上的完全。– 斯科特·奧斯汀 15年9月17日在15:02 | 顯示<b>4</b>更多評論 |
了投票 七 投票表決 | 雨燕3 dispatchqueue.main.async {
}
分享 提高這個答案 | 回答 10月11日下午13:36 愛德華多花漾 三百七十九 一 十五 | |
添加評論 |
了投票 二 投票表決 | 您的代碼更新UI布局從背景線程。隊列,你運作你的代碼,改變操作上不需要。例如NSURLSession。shared()并不時使用的主要隊列的新要求。確定你的代碼運作在主線程中,我使用的nsoperationqueue的靜态方法。 Swift: NSOperationQueue。mainqueue()。addoperationwithblock() {
/做UI的東西
}
Obj-C: [ nsoperationqueue mainqueue ] addoperationwithblock:^ {
/做UI的東西
} ];
分享 提高這個答案 | 編輯10月10日上午10:47 | 回答 5月26日在38 尼古拉 五百九十三 八 九 | |
添加評論 |
了投票 二 投票表決 | 所有的UI部分更新你需要進入應用程式的主線程。 我叫<strong>createmenuview()</strong>為背景,我得到了下面的錯誤 “這個應用程式是從一個背景線程修改布局的發動機,進而導緻發動機損壞和怪異的崩潰” 是以我叫到主線程的使用方法 dispatchqueue.main.async {
}
斯威夫特3和Xcode 8 正确的代碼寫在下面: RequestAPI。後(poststring:poststring,網址:“http:/ / www.someurl .com”){(成功:bool、味精:字元串,responcedata:任何物體)->()在
如果(成功){
列印(項目:“使用者登入。注冊完成。”)
/移動到UI線程
dispatchqueue.main.async(執行:{()>無效
/設定使用者的登入-
util。set_isuserloggedin(狀态:真的)
util。set_userdata(使用者資料:responcedata)
自我。AppDelegate. createmenuview()
})
} {
其他
/移動到UI線程
dispatchqueue.main.async(執行{()->無效:在
讓alertcontroller = UIAlertController(标題:jjs_message,消息:味精,preferredstyle:uialertcontrollerstyle。警報)
alertcontroller.title =“沒有網際網路”
alertcontroller.message = failure_message
目前(alertcontroller,自我。動畫:真的,完成:零
|