如何从块中获取NSString?

Liz*_*zza 2 iphone return-value fmdb objective-c-blocks

我一直在尝试,但我只是没有得到很好的块.我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这对我来说很难掌握,但我需要能够对结果集中的字符串做些什么.通常,我会把它归还,但那不会飞到这里.有人可以对此有所了解吗?

谢谢

编辑:我正在调用我的数据库访问对象,希望返回一个特定的值.很多这些调用都将在后台线程上运行,所以我使用这个数据库队列是线程安全的.我已经更新了sql查询的上下文,以显示我需要做的事情.

Lil*_*ard 7

看来你的问题归结为"如何从块内部返回一个值回调用函数?" 它实际上相当简单,只要块同步执行即可.只需使用__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];
Run Code Online (Sandbox Code Playgroud)

注意,保留是因为可能有一个自动释放池包裹在块周围,我们需要确保该值仍然存在(然后我们可以在块之外自动释放它).

如果该块是异步执行的,那么您不可能从调用函数返回值.如果您需要处理这种情况,那么您需要将值交回适当的线程以供以后处理,例如

NSString *str = [rs fetchStringSomehow];
dispatch_async(dispatch_get_main_queue(), ^{
    processString(str);
});
Run Code Online (Sandbox Code Playgroud)