5

私はこれと非常によく似た問題を抱えています

基本的に、Parse.com を使用して PFUser ポインターを持ついくつかのオブジェクトをロードし、次に includeKey を使用してそれらの PFUsers を含めています。コードは次のとおりです...

PFQuery *query = [PFQuery queryWithClassName:@"GameVillageObject"];

    [query whereKey:@"region" equalTo:[NSNumber numberWithInt:region]];
    [query includeKey:@"pfUser"];
    query.limit = 100;

    [sharedInstance requestSentWithDesc:@"Get all village objects in region"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *PUObjects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d village objects from server.", PUObjects.count);

            if(PUObjects.count > 0)
            {
                villageObjects = PUObjects;

                for (int i=0; i<[villageObjects count]; i++)
                {

                    PFObject *villageItem = [villageObjects objectAtIndex:i];

                    PFUser *user = [villageItem objectForKey:@"pfUser"];

                    NSString *userName = [NSString stringWithFormat:@"%@",[user objectForKey:@"username"]];

                    NSLog(@"User name is: %@.", userName);


                }


                [self setupVillageList];

                [sharedInstance centerImage:marketItemsContainer xChoice:YES yChoice:NO];

            }

        } else {
            // Log details of the failure
            NSLog(@"Getting village objects Error: %@ %@", error, [error userInfo]);

        }
    }];

何らかの理由で、10 回に 1 回、ゲームがクラッシュし、このエラーが発生することがあります。

キー「username」にはデータがありません。値を取得する前に fetchIfNeeded を呼び出します。

上記の「ユーザー名」を使用しようとするとクラッシュするのか、それとも少し後で「ユーザー名」を使用しようとするとクラッシュするのかわかりませんが、どちらの方法でも、ほとんどの場合問題がない理由がわかりませんそれらの余分なオブジェクトと、そうでない場合が数回あります。何か案は?

4

2 に答える 2

13

関連がロードされていないように聞こえますがuser、ほとんどのインスタンスでキャッシュされている可能性があります (したがって、利用可能です)。これを解決するには2つの方法が考えられます。

1)fetchIfNeededエラー メッセージで提案されているように呼び出します。

PFQuery *query = [PFQuery queryWithClassName:@"GameVillageObject"];

[query whereKey:@"region" equalTo:[NSNumber numberWithInt:region]];
[query includeKey:@"pfUser"];
...
  PFObject *villageItem = [villageObjects objectAtIndex:i];

  PFUser *user = [villageItem objectForKey:@"pfUser"];
  [user fetchIfNeeded];
  NSString *userName = [NSString stringWithFormat:@"%@",[user objectForKey:@"username"]];

  NSLog(@"User name is: %@.", userName);

2)呼び出しで指定pfUser.usernameするincludeKey:

[query whereKey:@"region" equalTo:[NSNumber numberWithInt:region]];
[query includeKey:@"pfUser.username"];
query.limit = 100;
...

usernameこれにより、クエリの実行時にParse にロードするように指示する必要があります。

于 2013-08-26T01:34:04.497 に答える
1

私はこれと同じ問題を抱えていました。

これが私がしたことです:

  1. ポインターで fetchIfNeeded を呼び出します。

元。

[someObject.user fetchIfNeeded]

これにより、必要なユーザーに関する情報が取得されます。

  1. ユーザー オブジェクトから PFFile が必要な場合は、次の操作を実行できます。

//このコードを cellForRowAtIndexPath で実行し、ユーザーのプロフィール画像を更新したい場合は、次のようにします。

User *user = (User *)someObject.user;

 [user.profileImage getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {

        if (!error) {

            UIImage *image = [UIImage imageWithData:data];



            cell.userProfileImage.image = image;
        }else{
            NSLog(@"Print error!!! %@", error.localizedDescription);
        }


    }];
于 2015-08-20T02:26:16.750 に答える