Swift中AWS Amplify GraphQL实时事件订阅初始化问题咨询
AWS Amplify Swift 订阅配置问题解决
问题分析
你用Swift在Xcode开发的应用已对接AWS Amplify,能实现todos的创建和读取,但配置DynamoDB表更新订阅时遇到问题:直接复制官方文档代码会报class EnableSubscription has no initializers错误,你添加了init方法解决编译问题,但不确定代码正确性,也不清楚如何初始化订阅。
代码问题与优化
你的代码能编译,但设计上有冗余——init方法要求传入subscription,但createSubscription方法里会重新赋值这个变量,完全没必要。问题根源是Swift类的存储属性必须有初始值,文档代码是片段没处理初始化逻辑,所以你加init是正确的编译修复,但可以更合理优化:
优化方案1:将订阅变量改为可选类型(推荐)
去掉多余的init,把subscription设为可选,避免不必要的初始化参数:
class EnableSubscription { // 设为可选类型,默认初始值为nil var subscription: AmplifyAsyncThrowingSequence<GraphQLSubscriptionEvent<Todo>>? func createSubscription() { subscription = Amplify.API.subscribe(request: .subscription(of: Todo.self, type: .onCreate)) Task { // 确保subscription存在再遍历 guard let subscription = subscription else { return } do { for try await subscriptionEvent in subscription { switch subscriptionEvent { case .connection(let state): print("订阅连接状态:\(state)") case .data(let result): switch result { case .success(let createdTodo): print("成功从订阅获取Todo:\(createdTodo)") case .failure(let error): print("订阅数据获取失败:\(error.errorDescription ?? "未知错误")") } } } } catch { print("订阅已终止:\(error)") } } } }
优化方案2:不保留订阅引用(无需手动取消时用)
如果不需要手动取消订阅,可直接在方法内创建订阅变量,无需存储为实例属性:
class EnableSubscription { func createSubscription() { // 直接在方法内创建订阅,无需实例变量存储 let subscription = Amplify.API.subscribe(request: .subscription(of: Todo.self, type: .onCreate)) Task { do { for try await subscriptionEvent in subscription { switch subscriptionEvent { case .connection(let state): print("订阅连接状态:\(state)") case .data(let result): switch result { case .success(let createdTodo): print("成功从订阅获取Todo:\(createdTodo)") case .failure(let error): print("订阅数据获取失败:\(error.errorDescription ?? "未知错误")") } } } } catch { print("订阅已终止:\(error)") } } } }
初始化与使用方式
两种方案的使用方法一致,只需创建类实例并调用订阅方法即可:
// 创建订阅管理实例 let subscriptionManager = EnableSubscription() // 启动订阅 subscriptionManager.createSubscription()
如果需要手动取消订阅,用方案1的代码,调用:
subscriptionManager.subscription?.cancel()
内容的提问来源于stack exchange,提问作者FreedomfromFlight
相关产品推荐
相关产品推荐

