2015-01-06 2 views
1

나는 수천 명의 사용자 (~ 3,000)의 이름을 검색해야하는 구문 분석 IOS 응용 프로그램이 있습니다. 내가 할 수 있도록 내 검색 코드를 수정하려고하는데 도움이 필요합니다. 나는 모든 올바른 매개 변수없이 하단에있는 filterResults를 호출하기 때문에구문 분석에서 1000 개가 넘는 검색어로 검색

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    if (tableView == self.tableView) { 

     return self.objects.count; 

    } else { 
     return self.searchResults.count; 

    } 

} 


-(void)filterResults:(NSString *)searchTerm :(int)limit :(int)skip { 


    [self.searchResults removeAllObjects]; 

    PFQuery *query = [PFQuery queryWithClassName:@"_User"]; 
    [query whereKey:@"isTeacher" equalTo:@"False"]; 
    [query setLimit: limit]; 
    [query setSkip: skip]; 

    [[[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (objects.count == limit) { 
      [self performTeacherQueryWithLimit:limit andSkip:skip+limit]; 
     } 

     else{ 
     NSArray *results = [NSArray arrayWithArray:objects]; 

     NSLog(@"%@", results); 
     NSLog(@"%lu", (unsigned long)results.count); 
     NSLog(@"results^"); 


     [self.searchResults addObjectsFromArray:results]; 

     NSPredicate *searchPredicate = 
     [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",searchTerm]; 
     _searchResults = [NSMutableArray arrayWithArray:[results filteredArrayUsingPredicate:searchPredicate]]; 
     [self.searchDisplayController.searchResultsTableView reloadData]; 

     NSLog(@"%@", _searchResults); 
     NSLog(@"%lu", (unsigned long)_searchResults.count); 
     NSLog(@"search results^"); 
     } 

    }]; 
    ]] 

} 

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    [self filterResults:searchString]; 
    return YES; 
} 

이 코드는 작동하지 않습니다하지만 난 중간으로 침입해서 지금은 붙어이기 때문에 즉 : 지금 검색 내 코드는 다음과 같습니다. setSkip을 사용해야한다는 것을 알고 있지만 내 검색을 위해 그 작업을 수행하는 방법을 잘 모르겠습니다. 어떤 도움이 굉장 할 것입니다! 감사!

답변

5

나는 다음과 같이 함께 쿼리와 그 결과를 처리하는 방법으로 이런 종류의 작업을 수행합니다

PFQuery *query = [PFQuery queryWithClassName:@"MyClass"]; 
// setup query 
query.limit = // set this to a reasonable size 
// the given method will do ceil(N/limit) finds, where N is the number 
// of rows that satisfy the query 

NSMutableArray *array = [@[] mutableCopy]; 
[self runQuery:query filling:array completion:^(BOOL success) { 
    NSLog(@"%@", array); 
    // you would do your local search and set search results here 
}]; 

보다 기능 버전이 부를 것이다 :

- (void)runQuery:(PFQuery *)query filling:(NSMutableArray *)array completion:(void (^)(BOOL))completion { 
    query.skip = array.count; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      [array addObjectsFromArray:objects]; 
      if (objects.count < query.limit) { 
       return completion(YES); 
      } else { 
       [self runQuery:query filling:array completion:completion]; 
      } 
     } else { 
      return completion(NO); 
     } 
    }]; 
} 

이처럼 사용 질의 사이의 진행 블록. 이렇게하면 결과를 지속적으로 업데이트 할 수 있습니다. 이를 위해서는 진행 블록 매개 변수를 추가하고 [array addObjectsFromArray:objects]; 바로 뒤에 호출하십시오.

+0

감사합니다. 나는 매우 가깝지만 어떤 이유로 든 결과 중 일부가 돌아 오지 않는다. 우리가 채팅하면 어떨까요? 내 코드를 보여주고 싶다. 그것은 굉장 할 것이다! @danh –

+0

채팅에 가면 행복하지만 의견을 입력하는 데 너무 오래 걸리는 경우가 있습니다. – danh

+0

그게 사실이야. 알았어. 내 질문을 편집 할 수있어. 괜찮을 까? –

관련 문제