我的 iOS 设备中有一个小型 sqlitedb。当用户按下按钮时,我从 sqlite 获取数据并将其显示给用户。
我想在后台线程中执行此获取部分(以免阻塞 UI 主线程)。我这样做-
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
获取并进行一些处理后,我需要更新 UI。但因为(作为一个好的实践)我们不应该从后台线程执行 UI 更新。我打电话给selector
在主线程上像这样 -
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
但我的应用程序在第一步就崩溃了。即启动后台线程。这不是iOS启动后台线程的方法吗?
更新1: After [self performSelectorInBackground....
我得到这个堆栈跟踪,没有任何信息 -
更新2:我什至尝试过,像这样启动后台线程 -[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
但我仍然得到相同的堆栈跟踪。
只是为了澄清一下,当我在主线程上执行此操作时,一切都运行顺利......
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;
}