2014-06-11 2 views
0

다음은 구문 쿼리입니다. 컬렉션 뷰에서 범주를 표시하려고 시도하지만 getCategories에 구문 분석에서 정보를 가져 오기 전에 numberOfItemsInSection 메서드가 실행됩니다. numberOfItemsInSectiongetCategories _anArrayOfCategories을 사용하여 컬렉션보기에서 범주 수를 반환합니다.내 구문 분석 쿼리가 나머지 응용 프로그램이 완료 될 때까지 완료되지 않습니다. 어떻게 이런 일이 발생하지 않게합니까?

-(void)getCategories{ 
    [super viewWillAppear:animated]; //calls retrieve messages method below 

    //get Categories where the class name is Categories 
    PFQuery *query = [PFQuery queryWithClassName:@"Categories"]; 
    //- (void)selectKeys:(NSArray *)keys 
    [query selectKeys:@[@"CName"]]; 
    //[query whereKey:@"recipientIds" equalTo:[[PFUser currentUser] objectId]]; 
    [query orderByAscending:@"createdAt"]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (error) { 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 

     else { 
      _anArrayOfCategories = [[NSArray alloc] initWithArray:objects]; 
      NSLog(@"Test 1: Retrieved %lu Categories", (unsigned long)[_anArrayOfCategories count]); 

     } 
    }]; 

} 

제안 사항?

+0

'_arrayOfCategories' 설정 후'[self.tableView reloadData]'에 대한 호출을 추가하십시오. 주 스레드에서 호출이 이루어 졌는지 확인하십시오. – rmaddy

답변

1

쿼리가 완료된 후 테이블을 업데이트하거나 이전 컨트롤러에서 쿼리를 만들고이 컨트롤러가 완료된 후에이 컨트롤러로 이동하십시오. 이것들은 UI 작업이고 메인 스레드에서 수행되어야한다는 것을 기억하십시오.

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (error) { 
     NSLog(@"Error: %@ %@", error, [error userInfo]); 
    } 

    else { 
     _anArrayOfCategories = [[NSArray alloc] initWithArray:objects]; 
     NSLog(@"Test 1: Retrieved %lu Categories", (unsigned long)[_anArrayOfCategories count]); 
     dispatch_async(dispatch_get_main_queue(), ^{ // UI operations on the main thread 
      [self.tableView reloadData]; 
     }); 

    } 
}]; 

편집 :이 게시물에서 불분명으로 그냥 확인하기 위해, 당신은 numberOfRowsInSection에서이 메소드를 호출하지 않습니다. viewDidLoad 또는 그와 비슷한 것으로 입력 한 다음 numberOfRowsInSection_anArrayOfCategories 개체를 사용합니다.

+0

안녕하세요, 대단히 감사합니다. _anArrayOfCategories = [[NSArray alloc] initWithArray : objects]; NSLog (@ "테스트 1 : 검색된 % lu 범주", (부호없는 long) [_ anArrayOfCategories 개수]); NSLog (@ "% @", _ anArrayOfCategories); // 이러한 작업은 UI 작업이므로 기본 스레드에서 수행해야합니다. dispatch_async (dispatch_get_main_queue(),^{ [self.collectionView reloadData]; 이것은 모두 콜렉션 뷰 컨트롤러에서 수행됩니다. –