gpt4 book ai didi

ios - FMDatabaseQueue 如何返回一个值

转载 作者:可可西里 更新时间:2023-11-01 03:06:41 25 4
gpt4 key购买 nike

我在我的 iOS 应用程序中使用 FMDatabaseQueue。我一直在理解如何在创建队列时返回值。感谢您的帮助!!

 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; 

[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
...
}
// I want value to be returned from here
}];

最佳答案

这取决于您要返回的内容。但是可能会让您感到困惑的是,如果您从 inDatabase block 中发出一个 return 语句,那么您是从 block 中返回,而不是从方法中返回包含此 inDatabase block 。

因此,您只是不从 inDatabase block 返回值,而是从 block 外部返回值。所以你通常会做的是,你将声明你的变量在 inDatabase block 的外部返回,你的 inDatabase block 将更新它,然后,当该 block 完成时,即返回结果(不是从 inDatabase block 内)。

一个常见的例子是,如果你正在构建一个 NSMutableArray:那么在 block 外创建可变数组,然后从 block 内添加值,然后返回结果 你退出 inDatabase block :

NSMutableArray *results = [NSMutableArray array];   // declare this outside the block

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

[queue inDatabase:^(FMDatabase *db) {

[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(1)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(2)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(3)];

FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
...
[results addObject:result]; // add values inside the block
}
[rs close];
}];

return results; // return the results outside the block

或者,如果您正在处理一些基本类型,例如 NSIntegerBOOL 或其他类型,您可以使用 声明变量__block 限定符。例如,我将使用它来返回一个 BOOL 成功变量,例如:

__block BOOL success;                               // again, define outside the block

NSMutableArray *results = [NSMutableArray array];
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

[queue inDatabase:^(FMDatabase *db) {

[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(1)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(2)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(3)];

FMResultSet *rs = [db executeQuery:@"select * from foo"];
if (!rs)
{
NSLog(@"%s: %@", __FUNCTION__, [db lastErrorMessage]);
success = NO; // set the value inside the block
return; // note, this doesn't exit the method; this exits this `inDatabase` block
}

while ([rs next]) {
...
}

[rs close];
success = YES; // another example of setting that `success` variable
}];

// so whether I successfully completed the block, or whether I hit the `return`
// statement inside the block, I'll fall back here, at which point I'll return my
// boolean `success` variable

return success; // don't return the value until after you exit the block

虽然您第一次遇到它时可能会感到困惑,但理解它很有用。当你开始大量使用 GCD block 时,这种模式很常见。当您有一个 block (由 ^ 字符表示)时,您几乎必须将其视为您在 main 方法定义的函数。当您在 block 内遇到 return 时,您将返回到包含该 block 的方法。

block 的介绍见:

关于ios - FMDatabaseQueue 如何返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16765874/

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