我的 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: 我甚至尝试了,启动了一个像 so-这样的后台线程
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
but still I get same stacktrace.
只是为了澄清一下,当我在主线程上执行这个操作时,一切都运行得很顺利..。
UPDATE 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;
}