2013-08-25 17 views
5

Mam problem bardzo podobny do tego oneDziwny problem z Parse.com z kluczem nie zostały ujęte

Zasadniczo używam Parse.com załadować kilka obiektów, które mają wskaźniki PFUser, a potem jestem również za pomocą includeKey obejmuje te PFUsers, oto kod ...

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

     } 
    }]; 

teraz z jakiegoś powodu, everynow i znowu, może 1 raz na 10, gra jest upaść, z tym błędem

Klucz "userna" me "nie ma danych. Wywołanie fetchIfNeeded przed uzyskaniem wartości .

Chociaż nie mogę powiedzieć, czy to upaść, gdy próbuję użyć „nazwę użytkownika” powyżej, lub nieco później, gdy próbuję użyć „nazwę użytkownika”, ale tak czy inaczej, ja nie rozumiem, dlaczego większość czas, w którym nie ma problemu, w tym te dodatkowe obiekty, a następnie kilka razy nie. Jakieś pomysły?

+0

Proszę wyjaśnić "lub nieco później, kiedy próbuję użyć" nazwa użytkownika "...", ponieważ nie pokazałeś, gdzie go używasz i może to być przyczyną błędu. –

Odpowiedz

13

Wygląda na to, że skojarzony user nie jest ładowany, ale może być buforowany w większości przypadków (iw ten sposób dostępny). Mogę wymyślić dwa sposoby rozwiązania tego problemu.

1) Zaproszenie fetchIfNeeded jak sugeruje komunikat o błędzie:

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) Określ pfUser.username w includeKey: rozmowy

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

ten powinien powiedzieć Parse załadować username gdy kwerenda jest wykonywana.

+0

Widziałem fetchIfNeeded, ale nie byłem pewien, czy potrzebuje callback/block dla tego wyniku, a jeśli nie, to zakładam, że blokuje główny wątek? co nie jest końcem świata, ale zastanawiałem się, czy istnieje sposób, aby tego uniknąć, z tego powodu opcja 2 powyżej może być lepszą drogą. Dzięki. – Phil

+4

W rzeczywistości użycie drugiej opcji daje błąd "nie można podać nazwy użytkownika pola, ponieważ nie jest wskaźnikiem do innego obiektu" – Phil

+0

[user fetchIfNeeded]; jest odpowiedzią dla mnie! Dzięki –

1

Miałem ten sam problem.

Oto co zrobiłem:

  1. wezwanie fetchIfNeeded na wskaźniku.

np.

[someObject.user fetchIfNeeded] 

będzie uzyskać informacje o użytkowniku, które potrzebujesz.

  1. Jeśli potrzebujesz PFFile z obiektu użytkownika, możesz wykonać następujące czynności.

// Jeśli uruchomisz ten kod w komórceForRowAtIndexPath i chcesz zaktualizować obraz profilu dla użytkownika, możesz wykonać następujące czynności.

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


    }]; 
Powiązane problemy