gpt4 book ai didi

iphone - 如何从 block 中获取 NSString?

转载 作者:行者123 更新时间:2023-12-03 20:20:09 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com