エラーが発生します:
「メインスレッドで実行中の解析操作が実行されています。デバッグするにはwarnParseOperationOnMainThread()で中断してください。」
そして
「warnParseOperationOnMainThread()をブレークしてデバッグしてください。」
コード内でエラーを見つけることができません。誰かが私が間違っていることを教えてもらえますか?
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:@" "];
}];
これは、開発者がメインスレッドをブロックするParse呼び出しを行うときの穏やかな警告です。
ここですべてが発生することがわかります。2015年以降にリリースされたParse APIを使用する場合にのみ、warnBlockingOperationOnMainThread
にsymbolic breakpointを追加します。それ以外の場合は、warnParseOperationOnMainThread
に配置します。
コードを実行している間、その関数は中断され、ブロッキング関数を見つけるのに役立つスタックトレースが表示されます。
以下の画像を参照して、理解を深めてください。
私にとってこれは私が電話したときに起こりました:
[[PFUser currentUser] refresh];
解決策はそれを次のものに置き換えることでした:
[[PFUser currentUser] refreshInBackgroundWithBlock:nil];
Parseヘルプサイトのこの回答 も参照してください。
ほとんどすべてのParseクエリまたはデータ保存で発生します。これを回避し、バックグラウンドで操作を実行するオプションがあります。実際には2つの選択肢があります。1つはバックグラウンドで実行する方法で、もう1つはコードブロックを使用してバックグラウンドで実行する方法です。
少し遅いかもしれませんが、ここに行きます。問題は、同時にオブジェクトフェッチを取得しようとしているという事実に起因すると思います。
[[PFUser currentUser] objectId];
そして:
[query getObjectInBackgroundWithId...];
次のように、最初にuserIdを取得することをお勧めします。
//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:@" "];
}];
出来上がり!