2014-02-26 77 views
2

我都是新來的Parse和iOS開發。基本上我試圖實現一個方法來檢索一個類中的解析對象,其他類將調用一個entityName來返回對象。因此,另一個班級將以entityName作爲參數調用方法retrieveRecords重複使用findObjectsInBackgroundWithBlock方法:Array是零

但是,數組總是返回nil,因爲塊方法在數組返回後纔會執行。之前(當我獲取對象的工作時!)我只有一種方法來檢索相同的類中的對象,我需要的數據,所以我剛剛宣佈一個__block數組返回數據。

我知道這是一個普遍的問題,因爲我廣泛搜索它,但我似乎無法找到正確的解決方案,返回一個對象數組到另一個類,並以更多糾結的代碼不起作用。

- (void)doQuery:(NSString *)entityName 
{ 
    //Create query for all Post object by the current user 
    PFQuery *workoutQuery = [PFQuery queryWithClassName:entityName]; 
    [workoutQuery whereKey:@"owner" equalTo:[PFUser currentUser]]; 

    // Run the query 
    [workoutQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      //Save results and update the table 
      NSLog(@"Adding objects to the array"); 
      NSLog(@"Size %lu" , (unsigned long)objects.count); 

      //fill the array once the block is BEING EXECUTED 
      [self successfulRetrievedArray:objects]; 
     } 
    }]; 
} 

-(NSArray *)successfulRetrievedArray:(NSArray *)objects 
{ 
    self.objectsArray =[[NSMutableArray alloc]initWithArray:objects]; 
    return self.objectsArray; 
} 

-(NSArray *)retrieveRecords:(NSString *)entityName 
{ 
    //DO QUERY 
    [self doQuery:entityName]; 

    //RETRIEVE RECORDS 
    return self.objectsArray; 
} 

回答

2
- (void)doQuery:(NSString *)entityName withCompletionBlock:(void (^)(NSArray *objects, NSError *error))completionBlock { 
    //Create query for all Post object by the current user 
    PFQuery *workoutQuery = [PFQuery queryWithClassName:entityName]; 
    [workoutQuery whereKey:@"owner" equalTo:[PFUser currentUser]]; 

    // Run the query 
    [workoutQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      //Save results and update the table 
      NSLog(@"Adding objects to the array"); 
      NSLog(@"Size %lu" , (unsigned long)objects.count); 

      //fill the array once the block is BEING EXECUTED 
      [self successfulRetrievedArray:objects]; 

      if (completionBlock) { 
       completionBlock(objects, nil); 
      } 
     } else { 
      if (completionBlock) { 
       completionBlock(nil, error); 
      } 
     } 
    }]; 
} 

與上面一個替換你的代碼。只要把數組登錄完成塊

+0

謝謝SOOOOO多。真的很感激它! @ user2759361 – Sarah92

+0

@ Sarah92你應該接受這個評論,如果它是工作示例:) – user2786037

+0

只是粘貼代碼而不解釋它不是一個好的答案 – newacct

1

最好的辦法是將參數添加到doQuery:,以便調用者可以提供一個完成的塊。該塊將接收到的數組作爲參數,並在數組收到時調用。

通過這樣做,您可以接受數據收集是異步的,並迎合了該方法中的這一事實。

將結果存儲在self.objectsArray並不是很好,因爲沒有通知調用方數據已準備好,並且一次只能進行一個調用(因爲只有一個地方可以存儲結果) 。