2013-10-14 5 views
0

내 응용 프로그램에서 DB에서 일부 데이터를 읽을 필요가 그래서 어떤보기에서 모든 DB 관련 메서드를 포함하는 다른 클래스를 호출합니다. 이러한 방법의배경 SQLite 작업

하나는 쿼리를 다음과 같이 수행합니다

query = [NSString stringWithFormat: @"select * from orari where idutente=%d and date(orario)=date('now','localtime') order by orario", idUtente]; 

가 그럼 난 쿼리에서 데이터와 객체를 구축하고이 메소드에 의해 반환되는있는 NSMutableArray에 모든 개체를 추가하고 있습니다.

나는이 방법에 문제가 없으며 질문을 명확하게하기 위해이 방법의 모든 코드를 생략했다.

테이블 "orari"는 최대 18000 개의 레코드를 가질 수 있으며 약 6000 개의 레코드에서 해당 쿼리를 실행하기 만하면 시뮬레이터에는 약 4 ~ 6 초가 필요하다는 것을 알았습니다. 그래서 백그라운드 스레드에서이 메서드를 실행하면 주 스레드가 차단되지 않습니다.

은 그래서으로 시도했다 :
- (NSMutableArray *)NextGroup: (int)opt :(int)id { 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^(void) { 
     .... 
     here I execute my query, build the objects and add them all to my NSMutableArray 
     .... 
    }); 
    return myArray; 
} 

이제 문제는 수익이다. dispatch_async 블록 안에 넣으면 다음과 같은 오류가 발생합니다. "호환되지 않는 블록 포인터 유형이 'dispatch_block_t'유형의 매개 변수에 'NSMutableArray * (^) (void)'를 전달합니다 (일명 'void (^) (void)')." .

블록 외부에 놓으면 비어있게됩니다.

NSMutableArray를 블록에서 메서드로 전달한 다음이를 호출 한 뷰로 다시 전달하려면 어떻게해야합니까?

+0

모든 데이터를 메인 스레드 또는 백그라운드로 동시에로드 하시겠습니까? 왜 행의 ID를로드하고 필요시 배치를 점진적으로로드합니까? –

+0

@LeoNatan 모든 데이터를로드하지 않습니다. 실제로는 개체에로드되는 레코드가 거의 없지만 쿼리가 전체 테이블을 통과해야한다고 생각하는 레코드를 선택해야합니다. – Aleph72

+0

당신이주는 술어는 데이터를 통해 효율적으로 진행됩니다. 그러나 "select *"를 수행하면 결과에 모든 레코드 데이터가 반환됩니다. "_rowid_"만 요청한 다음이 행 ID를 기반으로 페이징 데이터를 요청할 수 있습니다. –

답변

0

좋아, 알았어. 보시다시피, 나는 블록 외부 블록 배열을 선언 한

- (NSMutableArray *)NextGroup: (int)opt :(int)id { 
__block NSMutableArray *myArray = [NSMutableArray alloc] init]; 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^(void) { 
    .... 
    here I execute my query, build the objects and add them all to my NSMutableArray 
    .... 
}); 
return myArray; 
} 

다음 나는 이외의 반환 :이 그것을 할 수있는 최선의 방법 인 경우 단지 모르겠어요. 그것은 효과가 있지만 그것을하는 가장 좋은 방법입니까?