天天看點

message sent to deallocated instance異步排程聽上主線程後通知主線程

此應用程式是由一個背景線程修改布局的發動機,進而導緻發動機的腐敗和怪異的崩潰

轉自: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
message sent to deallocated instance異步排程聽上主線程後通知主線程
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
message sent to deallocated instance異步排程聽上主線程後通知主線程
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
message sent to deallocated instance異步排程聽上主線程後通知主線程
愛德華多花漾 三百七十九 一 十五
添加評論
了投票 二 投票表決

您的代碼更新UI布局從背景線程。隊列,你運作你的代碼,改變操作上不需要。例如NSURLSession。shared()并不時使用的主要隊列的新要求。確定你的代碼運作在主線程中,我使用的nsoperationqueue的靜态方法。

Swift:

NSOperationQueue。mainqueue()。addoperationwithblock() { 
 /做UI的東西
 }
           
Obj-C:
[ nsoperationqueue mainqueue ] addoperationwithblock:^ { 
 /做UI的東西
 } ];
           
分享 提高這個答案 編輯10月10日上午10:47 回答 5月26日在38
message sent to deallocated instance異步排程聽上主線程後通知主線程
尼古拉 五百九十三 八 九
添加評論
了投票 二 投票表決

所有的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,自我。動畫:真的,完成:零
           
分享 提高這個答案

繼續閱讀