gpt4 book ai didi

objective-c - 如何以@noescap 的方式在 Swift4 中使用带 block 的 Objective-C 函数?

转载 作者:行者123 更新时间:2023-11-28 07:32:06 24 4
gpt4 key购买 nike

我正在使用名为“YapDatabase”的 Object-C 框架在 Swift4 中开发一个 iOS 应用程序。在类“YapDatabaseConnection”中有一个带有这样一个 block 的 Object-C 函数:

- (void)readWithBlock:(void (^)(YapDatabaseReadTransaction *transaction))block;

我是这样使用函数的:

static func readNovelIds() -> [String]? {        
let account = XFAccountManager.share().account
var events: [XFNovelClickEvent]?
OTRDatabaseManager.shared.readOnlyDatabaseConnection?.read({ (transaction) in
events = XFNovelClickEvent.allNovelClickEvents(accountId: account.uniqueId, transaction: transaction)
})
guard let clickEvents = events else {
return nil
}
let readNovelsIds = clickEvents.map {
$0.bookId ?? ""
}
return readNovelsIds
}

我认为闭包会在“事件”参数声明后立即执行。事实上,闭包并没有在结果返回之前执行。为了寻找原因,我打开了 Xcode 生成的名为“YapDatabaseConnection.h(Interface)”的文件(使用 cmd+shift+o),发现该函数已经以这种方式转换为 Swift:

open func read(_ block: @escaping (YapDatabaseReadTransaction) -> Void)

那么,我该如何以@noescap 的方式使用这个函数呢?

最佳答案

作为调用者,您无法更改闭包的执行时间。这取决于 read() 函数。如果您控制该函数,则需要修改它以立即调用闭包。如果您不控制它,就无法修改它的行为方式。

您可以使用 DispatchGroup 将异步调用转换为同步调用,如 Waiting until the task finishes 中所述.但是,您不能在主队列上进行数据库调用;你冒着让应用程序崩溃的风险。作为一般规则,在这种情况下您应该只使用异步调用(即使 readNovelIds 也是异步的并采用完成处理程序)。

关于objective-c - 如何以@noescap 的方式在 Swift4 中使用带 block 的 Objective-C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54412917/

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