iOS 기기에 작은 sqlitedb가 있습니다. 사용자가 버튼을 누르면 sqlite에서 데이터를 가져 와서 사용자에게 보여줍니다.
이 가져 오기 부분은 백그라운드 스레드에서 수행하고 싶습니다 (UI 메인 스레드를 차단하지 않기 위해). 나는 이렇게한다-
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
가져 오기 및 약간의 처리 후 UI를 업데이트해야합니다. 그러나 (좋은 방법으로) 백그라운드 스레드에서 UI 업데이트를 수행해서는 안됩니다. 나는 selector
그렇게 메인 스레드를 호출합니다 -
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
하지만 내 앱은 첫 번째 단계에서 충돌합니다. 즉, 백그라운드 스레드를 시작합니다. iOS에서 백그라운드 스레드를 시작하는 방법이 아닙니까?
업데이트 1 :[self performSelectorInBackground....
이 스택 트레이스를 얻은 후 정보가 없습니다.
업데이트 2 : 나는 심지어 그렇게 배경 스레드를 시작하려고 시도
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
했지만 여전히 동일한 스택 추적을 얻습니다.
명확히하기 위해 메인 스레드에서이 작업을 수행하면 모든 것이 원활하게 실행됩니다.
업데이트 3 이것은 배경에서 실행하려는 방법입니다.
- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
SpotMain *mirror = [[SpotMain alloc] init];
NSMutableArray *filteredDocids = toProceessDocids;
if(![gMediaBucket isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
if(![gMediaType isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
if(![gPlatform isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];
self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
[filteredDocids release];
[mirror release];
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
return;
}
docids
가 유지 되는지 확인하십시오 .
docids
있습니다 retain
. 나는 그것을 뒀다 .h
로@property (nonatomic, retain) NSMutableArray *docids;
get
; 그게되어야합니다resultSetFromDB: