gpt4 book ai didi

ios - IOS中带有完成 block 的后台任务

转载 作者:行者123 更新时间:2023-12-01 18:18:14 25 4
gpt4 key购买 nike

我在IOS做一些数据库操作。基本上我想在后台线程中执行此操作。我尝试使用 GCD .但对我来说,问题是我想在完成后从这个过程中获得一些值(value)。在将项目插入数据库之前说,我检查项目是否已经存在。请看下面的代码

__block Boolean isExisting = false;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
NSString *path = [SqliteManager initDatabase];
if(sqlite3_open([path UTF8String], &database) == SQLITE_OK)
{
NSString *query = [NSString stringWithFormat:@"select count (campaignId) from POTC where Id='%@' and taskid='%@' and pocId='%@' and userId='%@'",[submission.campaignId stringRepresentation],[submission.taskId stringRepresentation],[submission.pocId stringRepresentation],[[UUID UUIDWithString:submission.userId] stringRepresentation]];
const char *sql = [query cStringUsingEncoding:NSASCIIStringEncoding];
sqlite3_stmt *selectStatement;
if (sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL) == SQLITE_OK)
{
while (sqlite3_step(selectStatement) == SQLITE_ROW)
{
if (sqlite3_column_int(selectStatement, 0) >0)
{
isExisting = true;
break;
}
}
sqlite3_finalize(selectStatement);
}
sqlite3_close(database);
}
return isExisting;
});

但是上面带有 return 语句的代码将无法工作,因为 dispatch-async 需要一个 void 代码块。我怎样才能在 IOS 中实现相同的目标? IOS中是否有类似动画完成 block 的东西?

最佳答案

该 block 必须具有 void 返回类型,因为在异步 block 中没有将值返回到的地方。

变量 isExisting 是合格的 __block这意味着它将在 block 分配给它时设置。不幸的是,一旦退出范围,您的主线程将无法访问它。谨慎的做法是让您的 block 调用另一个方法(或函数或 block )来设置您知道在异步 block 完成时仍然存在的变量或属性。

例如您可以在应用程序委托(delegate)上有一个方法在完成时调用。

// in your appDelegate implementation

-(void) updateUIAfterDatabaseUpdate: (bool) isExisting
{
if (isExisting)
{
// e.g. display an error
}
else
{
// successful update
}
}

// The update code

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
bool isExisting = false;

NSString *path = [SqliteManager initDatabase];
if(sqlite3_open([path UTF8String], &database) == SQLITE_OK)
{
// Snipped for clarity
}
dispatch_async(dispatch_get_main_queue(), ^(void) {
[appDelegate updateUIAfterDatabaseUpdate: isExisting] ;
});
});

主队列上的调度确保该方法在主线程中被调用,因此它可以进行 UI 更新。

关于ios - IOS中带有完成 block 的后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19565079/

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