2013-08-02 6 views
7

bloğu içinde var: Ben self.scoreDictionary yazdırırken, kod içine yorumladı bölümünde belirtildiği üzerefindObjectsInBackgroundWithBlock: Parse verileri alır, ama veriler sadece ben Parse veri alınırken denemek aşağıdaki test sınıfını yapılan

-(void)retrieveDataFromParse 
{ 
    PFQuery *query = [PFQuery queryWithClassName:@"TestObject"]; 

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if(!error){ 
      for (PFObject *object in objects){ 
       NSString *nameFromObject = [NSString stringWithFormat:@"%@", [object objectForKey:@"Name"]]; 
       NSString *dateFromObject = [NSString stringWithFormat:@"%@", [object createdAt]]; 
       NSString *scoreFromObject = [NSString stringWithFormat:@"%@", [object objectForKey:@"Score"]]; 
       [self addNewScore:scoreFromObject andDate:dateFromObject forUserName:nameFromObject]; 
       NSLog(@"The dictionary is %@", self.scoreDictionary); //<-- here it works printing out the whole dictionary 
      } 
     } else { 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
    }]; 
    NSLog(@"The dictionary is %@", self.scoreDictionary); //<- but after the block is called, here the dictionary is again empty... 
} 

kodun içinde, iyi çalışıyor ve adım adım dolduğunda tüm sözlüğümü görüyorum. Ancak, blok bittikten sonra, sözlüğü tekrar yazdırdığımda, artık boş. Sorgu API'sı dokümanlarını iki kez kontrol ettim, ancak hala yanlış yaptığımdan emin değilim.

cevap

13

Son NSLog(@"The dictionary is %@", self.scoreDictionary) bildirimi, blok tamamlandıktan sonra gerçekten yürütülmez. findObjectsInBackgroundWithBlock yönteminin döndürülmesinden sonra yürütülür. findObjectsInBackgroundWithBlock muhtemelen ayrı bir iş parçacığında bir şey çalıştırır ve bloğunuz aslında son NSLog ifadesinden sonra belirli bir süre geçmeyecek şekilde çalışmayabilir. Grafiksel, böyle bir şey muhtemelen oluyor:

Thread 1 
-------- 
retriveDataFromParse called 
invoke findObjectsInBackgroundWithBlock 
findObjectsInBackgroundWithBlock queues up work on another thread 
findObjectsInBackgroundWithBlock returns immediately  | 
NSLog statement - self.scoreDictionary not yet updated | 
retriveDataFromParse returns        | 
.               V 
.      Thread 2, starting X milliseconds later 
.      -------- 
.      findObjectsInBackgroundWithBlock does some work 
.      your block is called 
.      for-loop in your block 
.      Now self.scoreDictionary has some data 
.      NSLog statement inside your block 
Muhtemelen, ne bunu aldıktan sonra scoreDictionary verilerle yapmak istiyorsunuz düşünmek istiyorum

? Örneğin, kullanıcı arayüzünü güncellemek, başka bir yöntem aramak vb. Bu numaranızı bloğunuzda yapmak isteyeceksiniz, bu noktada veriler başarıyla alındığını bileceksiniz. Eğer yeniden isteyen bir tablo görünümü olsaydı Örneğin, siz yapabilirsiniz:

for (PFObject *object in objects){ 
    .... 
} 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [self updateMyUserInterfaceOrSomething]; 
}); 

Not dispatch_async - Verilerinizi güncellemeden sonra yapmanız gereken iş UI değişen içeriyorsa, istediğiniz edeceğiz Ana iş parçacığı üzerinde çalıştırmak için.

+0

sayesinde, özellikle konuları gösteren çok yararlı gösterim için! – daspianist