2013-08-25 23 views
5

Tôi đang gặp một vấn đề rất tương tự như sau onevấn đề Strange với Parse.com với phím không được bao gồm

Về cơ bản tôi đang sử dụng Parse.com để tải một số đối tượng, trong đó có con trỏ PFUser, và sau đó tôi 'm cũng sử dụng includeKey để bao gồm những PFUsers, đây là mã ...

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]); 

     } 
    }]; 

Bây giờ đối với một số lý do, everynow và một lần nữa, có thể 1 lần trong số 10, các trò chơi được đâm, với lỗi này

Chìa khóa "userna tôi "không có dữ liệu. Tìm nạp cuộc gọiNếu được nhận trước khi nhận giá trị .

Mặc dù tôi không thể biết nếu nó bị lỗi khi cố gắng sử dụng "tên người dùng" ở trên, hoặc một chút sau đó khi tôi cố gắng sử dụng "tên người dùng" nhưng một trong hai cách, tôi không hiểu tại sao hầu hết thời gian nó không có vấn đề bao gồm những đối tượng phụ và sau đó một vài lần nó không. Bất kỳ ý tưởng?

+0

Vui lòng giải thích "hoặc một chút sau khi tôi cố gắng sử dụng" tên người dùng "...", vì bạn chưa cho biết nơi bạn đang sử dụng và đó có thể là lỗi. –

Trả lời

13

Có vẻ như số liên kết user không được tải, nhưng có thể được lưu trong bộ nhớ cache trong hầu hết các trường hợp (và do đó có sẵn). Tôi có thể nghĩ ra hai cách để giải quyết vấn đề này.

1) Gọi fetchIfNeeded theo đề nghị của các thông báo lỗi:

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) Xác định pfUser.username trong includeKey: gọi

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

này nên nói với Parse để tải username khi truy vấn được thực thi.

+0

Tôi thấy fetchIfNeeded nhưng tôi đã không chắc chắn nếu nó cần một callback/block cho kết quả của nó, và nếu không thì tôi đoán nó chặn thread chính? mà không phải là kết thúc của thế giới nhưng tôi tự hỏi nếu có một cách để tránh điều đó, vì lý do đó có thể lựa chọn 2 ở trên có thể là cách tốt hơn để đi. Cảm ơn. – Phil

+4

Trên thực tế sử dụng tùy chọn thứ 2 cho lỗi "tên người dùng trường không thể được bao gồm bởi vì nó không phải là một con trỏ đến đối tượng khác" – Phil

+0

[người dùng fetchIfNeeded]; là câu trả lời cho tôi! Cám ơn –

1

Tôi gặp vấn đề tương tự.

Dưới đây là những gì tôi đã làm:

  1. gọi fetchIfNeeded trên con trỏ.

ví dụ:

[someObject.user fetchIfNeeded] 

điều này sẽ nhận được thông tin về người dùng mà bạn cần.

  1. Nếu bạn cần một PFFile từ đối tượng người dùng, bạn có thể làm như sau.

// nếu bạn chạy mã này trong cellForRowAtIndexPath và muốn cập nhật hình ảnh hồ sơ cho người dùng, bạn có thể làm như sau.

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); 
     } 


    }];