2014-01-08 51 views
24

我收到錯誤執行。有人可以告訴我我做錯了什麼嗎?長期運行的分析操作被主線程

PFQuery *query = [PFQuery queryWithClassName:@"User"]; 
[query getObjectInBackgroundWithId:[[PFUser currentUser] objectId] block:^(PFObject *object, NSError *error) { 

    self.firstName = object[@"firstname"]; 
    self.lastName = object[@"lastname"]; 

    self.nameLabel.text = [[NSArray arrayWithObjects:self.firstName, self.lastName, nil] componentsJoinedByString:@" "]; 
}]; 
+0

也許這行'PFQuery * query = [PFQuery queryWithClassName:@「User」];'是一個長時間運行的作業,將阻塞主線程。 – KudoCC

回答

54

這是一個溫柔的警告給開發商當他們將阻塞主線程解析調用。

在這裏,你可以看到這一切發生,,上warnBlockingOperationOnMainThread添加象徵斷點只有在使用從2015+發佈瞭解析API。否則,把它放在warnParseOperationOnMainThread

當你運行你的代碼時,它會中斷這個函數,並且會向你顯示一個堆棧跟蹤,它可以幫助你找到阻塞函數。

查看下面的圖片有一個更好的理解。

enter image description here

enter image description here

+6

對於2015+時代的任何人,您需要在符號斷點處使用'warnBlockingOperationOnMainThread',而不是'warnParseOperationOnMainThread'。 – Mike

+1

非常感謝您的信息。 –

+0

是否可以使此警告無聲? –

6

對我來說,這件事發生時我叫:

[[PFUser currentUser] refresh]; 

的解決方案是用來替換:

[[PFUser currentUser] refreshInBackgroundWithBlock:nil]; 

又見this answer on the Parse Help site

+1

+1對我來說,它是'[[PFInstallation currentInstallation] save];'vs'[[PFInstallation currentInstallation] saveInBackground];',但是同樣的想法。 – Olie

0

也許這有點遲,但在這裏你去。我想從你試圖讓對象在同一時間內獲取的事實來問題:

[[PFUser currentUser] objectId]; 

和:

[query getObjectInBackgroundWithId...]; 

這將是最好先獲取用戶標識,如:

//First fetch and store the id in a string so you can reuse it whenever you want 
NSString *userId = [PFUser currentUser].objectId; 

二:

// Do your second fetch here:   
    PFQuery *query = [PFQuery queryWithClassName:@"User"];   

[query getObjectInBackgroundWithId:userId block:^(PFObject *object, NSError *error) { 

self.firstName = object[@"firstname"]; 
self.lastName = object[@"lastname"]; 

self.nameLabel.text = [[NSArray arrayWithObjects:self.firstName, self.lastName, nil] componentsJoinedByString:@" "]; 
}]; 

Et瞧!

2

它幾乎發生在所有的分析查詢或數據保存。它避免了這種情況,可以選擇在後臺執行操作。實際上有兩種選擇,一種是在後臺執行,另一種是在後臺執行代碼塊。

+0

歡迎。你能否提供更多有關替代方案的細節? – mins

+0

例如用於保存數據: 1. saveInBackground 2. saveInBackgroundWithBlock 或查詢第一對象從數據庫: 1. query.getFirstObjectInBackgroud 2. query.getFirstObjectInBackgroudWithBlock –

相關問題