iphone - 如何从 block 中获取 NSString?

标签 iphone return-value objective-c-blocks fmdb

我真的一直在努力,但我只是不能很好地获得区 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/

相关文章:

iphone - 如何让 UIView 变得光滑 Shiny ?

ios - Xcode - 缺少架构(库链接)

php - 我可以用 C 语言包装我网站上的 PHP 代码来构建 iOS 应用程序吗?

Perl:从子例程返回后哈希值发生变化

c - C 函数可能的返回类型

ios - 在ios中制作GIF图像有多少图像数组

ios - 将完成 block 添加到 enumerateObjectsWithOptions

ios - 委托(delegate)方法在 SWRevealViewController 上不起作用

c++ - 在 C 和 C++ 中 main() 应该返回什么?

ios - UITextView 表示它在不存在时为空