Sri*_*aju 117 multithreading objective-c core-foundation uikit 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];但我仍然得到相同的堆栈跟踪.
就这样我澄清一下,当我在主线程上执行此操作时,一切运行顺畅......
更新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;
}
Run Code Online (Sandbox Code Playgroud)
Sco*_*bes 270
如果您使用performSelectorInBackground:withObject:生成新线程,则执行的选择器负责设置新线程的自动释放池,运行循环和其他配置详细信息 - 请参阅Apple的线程编程指南中的"使用NSObject生成线程".
但是,使用Grand Central Dispatch可能会更好:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self getResultSetFromDB:docids];
});
Run Code Online (Sandbox Code Playgroud)
GCD是一种更新的技术,在内存开销和代码行方面更高效.
更新了Chris Nolet的帽子提示,他提出了一个更改,使上述代码更简单,并与Apple最新的GCD代码示例保持一致.
小智 9
实际上,使用GCD非常容易.典型的工作流程是这样的:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
// Perform async operation
// Call your method/function here
// Example:
// NSString *result = [anObject calculateSomething];
dispatch_sync(dispatch_get_main_queue(), ^{
// Update UI
// Example:
// self.myLabel.text = result;
});
});
Run Code Online (Sandbox Code Playgroud)