作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的一直在努力,但我只是不能很好地获得区 block 。我正在使用FMDatabaseQueue ,我正在尝试制作一个非常简单的基于队列的查询。这就是我所拥有的:
-(NSString *) getReferenceForPage:(NSInteger) page
{
[queue inDatabase:^(FMDatabase *db) {
FMResultSet *rs = [db executeQuery:@"SELECT ref_text FROM table WHERE page = ?",[NSNumber numberWithInteger:page]];
if ([rs next]) {
//this is where I get the string
}
}];
return @""; //And this is where I need to return it, but I can't get it to work
}
我不知道为什么这对我来说很难理解,但我需要能够对从结果集中获得的字符串执行一些操作。通常情况下,我会直接返回,但这里不会飞。有人可以解释一下吗?
谢谢
编辑:我正在调用我的数据库访问对象,希望返回特定值。许多这些调用将在后台线程上运行,因此我使用此数据库队列来确保线程安全。我已经更新了 sql 查询周围的上下文以显示我需要做什么。
最佳答案
您的问题似乎可以归结为“如何将 block 内的值返回到调用函数?”其实很简单,只要block是同步执行的就可以了。只需使用 __block
变量并为其赋值即可。
__block NSString *result = nil;
[queue inDatabase:^(FMDatabase *db) {
// I'm assuming this is synchronous, because I'm not familiar with the API
FMResultSet *rs = [db executeQuery:@"SELECT ref_text FROM table WHERE page = ?", [NSNumber numberWithInteger:page]];
if ([rs next]) {
result = [[rs acquireStringSomehow] retain];
}
}];
return [result autorelease];
注意,保留是因为 block 周围可能有一个自动释放池,我们需要确保该值持续存在(然后我们可以在 block 之外自动释放它)。
如果该 block 是异步执行的,那么您不可能从调用函数返回值。如果您需要处理这种情况,那么您需要将值传回适当的线程以供以后处理,例如
NSString *str = [rs fetchStringSomehow];
dispatch_async(dispatch_get_main_queue(), ^{
processString(str);
});
关于iphone - 如何从 block 中获取 NSString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307111/
我是一名优秀的程序员,十分优秀!