2013-08-03 2 views
0

나는 UITableView를 채우기 위해 FMDB 래퍼와 함께 sqlite db를 사용하고있다. 서버에서 패치를 가져오고 백그라운드에서 sqlite의 데이터를 업데이트하는 스레드를 만든다. 통보와 함께, 그리고 거기에 20 reload 데이터가 연속적으로 발생 하고이 일이 일어날 때 그것은 사용자가 스크롤 할 수 있도록 uitableview를 더 잘로드 할 수있는 방법이 있다면, 연속적으로 relaod에 차단되어 있기 때문에 uitableview를 스크롤하는 것은 불가능합니다 jQuery과, 내가 Reloadrowsatindexpaths에 대해 생각하고 있어요,하지만 난 단 하나 개의 셀을 다시로드하면 내가이 할 jQuery과의 내용을 가져올 수 있기 때문에, 나는 sqlite가에서 컨텐츠를 refecth 할 수 있지만 필요reloadRowsAtIndexPaths with sqlite (FMDB)

- (void)loadTableViewInfo 
{ 
[self.source removeAllObjects]; 

FMDatabase *db = [FMDatabase databaseWithPath:path]; 

if ([db open]) { 
    FMResultSet *sectionQuery = [db executeQuery:@"SELECT name,id,age FROM user"]; 

    while([sectionQuery next]) 
    { 
     [self.source addObject:[sectionQuery resultDictionary]]; 
    } 
} 
} 
,691을

소스의 데이터 소스 배열은 누구나 내가 어떻게 할 수 있는지 말해 줄 수 있습니까?

답변

0

UITableView가 사용자의 상호 작용에 응답하지 못하도록 메인 스레드에서 차단하고있는 것 같습니다.

빠른 수정 self.source의 데이터를 쿼리를 실행하고 배치 할 배경 스레드를 생성하는 것입니다 :

- (void)loadTableViewInfo { 
    [self performSelectorInBackground:@selector(doBackgroundQuery) withObject:nil]; 
} 

- (void)doBackgroundQuery { 
    [self.source removeAllObjects]; 

    FMDatabase *db = [FMDatabase databaseWithPath:path]; 

    if ([db open]) { 
     FMResultSet *sectionQuery = [db executeQuery:@"SELECT name,id,age FROM user"]; 

     while([sectionQuery next]) 
     { 
      [self.source addObject:[sectionQuery resultDictionary]]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self.tableView reloadData]; 
      }); 
     } 
    } 
} 

장기적인 솔루션 NSOperationQueue을 사용하는 것입니다. 그것에 대해 질문이 있으면 알려주십시오.

+0

캐치되지 않은 예외 'NSRangeException'으로 인해 응용 프로그램이 종료 됨, 이유 : '*** - [NSArrayM objectAtIndex :] : 빈 배열의 범위를 벗어나는 인덱스 1' – Piero

+0

백그라운드 쿼리에서 removeAllObjects를 원본 및 테이블 뷰를 스크롤 할 때 분명히 충돌 ... – Piero

+0

오, 예, 당신은 변이하고있어 동일한 데이터 소스에 액세스하는 UITableView 싶지 않아요. '-reloadData'를 호출하기 전에'dispatch_async' 블록 안에'source'를'sourceUpdate'로 설정하는 것이 별개의 배열 (아마 sourceUpdate)을 만드는 것이 도움이 될 수 있습니다. –