我的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....
获得此stacktrace之后,再也没有任何信息-
更新2:我什至尝试启动这样的后台线程-
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
但仍然得到相同的stacktrace。
就像我澄清的那样,当我在主线程上执行此操作时,一切运行顺利...
更新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: