objective-c - iOS启动后台线程

我的 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]; 但我仍然得到相同的堆栈跟踪。

澄清一下,当我在主线程上执行此操作时,一切运行顺利...

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;
}

最佳答案

如果你使用 performSelectorInBackground:withObject: 来生成一个新线程,那么执行的选择器负责设置新线程的自动释放池、运行循环和其他配置细节 – 参见 "Using NSObject to Spawn a Thread"在 Apple 的 Threading Programming Guide 中。

您最好使用Grand Central Dispatch ,但是:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self getResultSetFromDB:docids];
});

GCD 是一种较新的技术,在内存开销和代码行数方面效率更高。


更新为Chris Nolet ,他提出了一项更改,使上述代码更简单,并跟上 Apple 最新的 GCD 代码示例。

https://stackoverflow.com/questions/7055424/

相关文章:

objective-c - 深拷贝一个 NSArray

iphone - cocoa 应用程序的 info plist 中的 "bundle display

iphone - Objective C 从字符串中解析整数

objective-c - 允许与另一个 UIView 下的 UIView 交互

objective-c - 如何在 Objective-C 中转换对象

iphone - 如何使 UIView 的 subview 居中

ios - UIActionSheet 取消按钮的奇怪行为

objective-c - "Auto Layout still required after ex

objective-c - 如何在 Objective-C 中执行回调

objective-c - 检查当前线程是否是主线程