如何使用Pigeon在iOS Swift中同步调用Flutter函数并获取返回值
如何用Pigeon在Swift中同步调用Flutter函数并获取返回值
首先得明确:Pigeon生成的Flutter API绑定天生是异步设计的,所有方法都依赖completion闭包来传递结果——这就是你原来代码报错的核心原因:completion闭包的返回类型是Void,你不能在里面直接return value。
不过我们可以通过iOS的**信号量(DispatchSemaphore)**来实现同步阻塞,等待异步回调完成后再返回结果。下面是具体的可行方案:
let flutterApi: MyFlutterApi? public func callSyncFunction() -> String? { // 创建初始值为0的信号量,用来阻塞当前线程 let semaphore = DispatchSemaphore(value: 0) var result: String? = nil flutterApi?.didSyncFunctionCalled(completion: { (value: String?, error: Error?) in // 将回调结果赋值给外部变量 result = value // 发送信号,通知等待的线程可以继续执行 semaphore.signal() }) // 等待信号量,设置超时时间(比如5秒)避免无限阻塞 let timeoutResult = semaphore.wait(timeout: .now() + 5) if timeoutResult == .timedOut { // 处理超时场景,比如返回nil或默认值 return nil } // 返回最终获取到的结果 return result }
关键注意事项:
- 禁止在主线程调用此方法:信号量会阻塞当前线程,如果在主线程执行会导致UI卡顿甚至死锁,建议放在后台队列调用,示例:
DispatchQueue.global().async { let syncResult = self.callSyncFunction() // 回到主线程处理结果(比如更新UI) DispatchQueue.main.async { // 处理返回值逻辑 } } - 必须设置超时时间:一定要给
wait方法指定合理的超时阈值,防止Flutter端异常导致线程永久阻塞。 - 补充错误处理:当前代码忽略了
error参数,你可以根据业务需求在completion闭包里添加错误处理逻辑(比如给result赋值默认值、记录错误日志等)。
这种方式本质是用同步写法封装了异步调用,是目前Pigeon框架下实现同步调用的可行变通方案。
内容的提问来源于stack exchange,提问作者G.Rulli
相关产品推荐
相关产品推荐

