我在我的iOS设备中有一个小的sqlitedb。当用户按下按钮时,我从sqlite获取数据并向用户显示它。
我希望将这个获取部分放在后台线程中(以避免阻塞UI主线程)。我是这样做的 -
[self performSelectorInBackground:@selector(getResultSetFromDB :) withObject:docids];
获取和一点处理之后,我需要更新UI。但由于(作为良好的实践)我们不应该从后台线程执行UI更新。我在主线程上调用了一个选择器,如下所示 -
[self performSelectorOnMainThread:@selector(showResults)withObject:nil waitUntilDone:NO];
但我的应用程序在第一步中崩溃。即启动后台线程的方法。这不是在iOS中启动后台线程的方法吗?
更新1:在[self performSelectorInBackground....之后,我会得到这个堆栈跟踪,没有任何信息 -
我希望将这个获取部分放在后台线程中(以避免阻塞UI主线程)。我是这样做的 -
[self performSelectorInBackground:@selector(getResultSetFromDB :) withObject:docids];
获取和一点处理之后,我需要更新UI。但由于(作为良好的实践)我们不应该从后台线程执行UI更新。我在主线程上调用了一个选择器,如下所示 -
[self performSelectorOnMainThread:@selector(showResults)withObject:nil waitUntilDone:NO];
但我的应用程序在第一步中崩溃。即启动后台线程的方法。这不是在iOS中启动后台线程的方法吗?
更新1:在[self performSelectorInBackground....之后,我会得到这个堆栈跟踪,没有任何信息 -
[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
是retain
的。我已经将其放在.h
文件中,作为@property (nonatomic, retain) NSMutableArray *docids;
。 - Srikar Appalaraju