2014-11-30 2 views
0

parse.com을 사용하여 음식 개체 데이터베이스를 보유하고 있으며 모든 음식을 포함하는 배열을 반환하려고합니다.배열을 반환 할 때 호환되지 않는 블록 포인터 유형이 필요합니까?

- (NSArray*) allFoods { 

    NSMutableArray *foodArr = [NSMutableArray array]; 
    PFQuery * foodQuery = [PFQuery queryWithClassName:@"Food"]; 
    foodQuery.limit = 5000; 
    [foodQuery findObjectsInBackgroundWithBlock:^(NSArray * foods, NSError * error) { 
      for (PFObject *foodRaw in foods) { 
       MenuItem *food = [[MenuItem alloc] initWithName:[foodRaw valueForKey:@"name"] andURL:nil]; 
       [foodArr addObject:food]; 
      } 

     return foodArr; 

    }]; 
} 

그러나 블록은 무효를 기대하며 오류를 발생시키지 않고 return 문을 포함 할 수 없습니다.

Incompatible block pointer types sending 'NSMutableArray *(^)(NSArray *__strong, NSError *__strong)' to parameter of type 'PFArrayResultBlock' (aka 'void (^)(NSArray *__strong, NSError *__strong)')

+0

을 새로 채워진 데이터로해야 할 일. 이 질문/답변을 확인하십시오. http://stackoverflow.com/questions/15070568/how-to-return-data-from-background-thread – Yan

답변

2

당신은 그런 것을 사용해야한다 : 나는 당신이 당신의 클래스의 foodArr 속성을 만드는 더 나은 그리고 그것은 백그라운드에서 채워집니다 때 않는 메소드를 호출 할 수 있다고 생각

typedef void (^ArrayResponseBlock)(NSArray *array); 

- (void) allFoodsAsyncWithCompletion:(ArrayResponseBlock)completionBlock { 

    NSMutableArray *foodArr = [NSMutableArray array]; 
    PFQuery * foodQuery = [PFQuery queryWithClassName:@"Food"]; 
    foodQuery.limit = 5000; 
    [foodQuery findObjectsInBackgroundWithBlock:^(NSArray * foods, NSError * error) { 
     for (PFObject *foodRaw in foods) { 
      MenuItem *food = [[MenuItem alloc] initWithName:[foodRaw valueForKey:@"name"] andURL:nil]; 
      [foodArr addObject:food]; 
     } 

     completionBlock(foodArr);   
    }]; 
}