同一视图控制器中的 AWS AppSync 多个订阅不起作用 - iOS Swift
AWS AppSync multiple subscriptions in same view controller not working - iOS Swift
仅供参考,我在 AWS AppSync 论坛中发布了这个问题 originally(以防将来 AWS 回答)。
我一直在尝试制作一个简单的 Posts 应用程序,就像 docs 中的应用程序一样,但我没有找到在一个视图控制器中处理多个订阅的文档或指南。
三个突变:onCreatePost、onUpdatePost、onDeletePost
(当然还有对这些突变的三个订阅)
在 Xcode 中,我在 viewDidLoad() 期间调用了三个函数:subscribeToNewPosts()、subscribeToUpdatedPosts()、subscribeToDeletedPosts()
每个订阅功能都可以工作并创建具有正确功能的订阅并相应地更新 table 视图 如果单独使用。但是,如果一个接一个地调用,只有最后一个订阅会实际接收数据并更新 table 视图。在订阅了所有三个突变
之后,我在 AppSyncMQTTClient.swift 中放置了一个断点来检查 topicSubscribersDictionary
func startNewSubscription(subscriptionInfo: AWSSubscriptionInfo) {
var topicQueue = [String]()
let mqttClient = MQTTClient<AnyObject, AnyObject>()
mqttClient.clientDelegate = self
for topic in subscriptionInfo.topics {
if topicSubscribersDictionary[topic] != nil {
// if the client wants subscriptions and is allowed we add it to list of subscribe
topicQueue.append(topic)
}
}
mqttClients.append(mqttClient)
mqttClientsWithTopics[mqttClient] = topicQueue
mqttClient.connect(withClientId: subscriptionInfo.clientId, toHost: subscriptionInfo.url, statusCallback: nil)
}
实际上所有三个订阅都在字典中...
我是否需要多个 appSyncClient 实例,每个订阅一个?是schema设计的问题吗?
示例用例:简单的聊天应用程序。新对话开始 = OnCreatePostSubscription;该对话中的新传入消息 = OnUpdatePostSubscription
您是否在 AppSync
中使用 API Key
进行授权?如果您使用 API Key
,此时 SDK 仅支持一个订阅。您能否切换到 IAM
(Cognito 身份)或基于 Cognito UserPools
的身份验证,看看多个订阅是否适合您?
通过在 AWSAppSyncSubscriptionWatcher
中将调用 startSubscriptions
替换为 startNewSubscription
,我设法让多个订阅与 API Key
一起使用
if let subscriptionInfo = subscriptionResult.subscrptionInfo {
self.subscriptionTopic = subscriptionResult.newTopics
self.client?.addWatcher(watcher: self, topics: subscriptionResult.newTopics!, identifier: self.uniqueIdentifier)
//self.client?.startSubscriptions(subscriptionInfo: subscriptionInfo)
subscriptionInfo.forEach { self.client?.startNewSubscription(subscriptionInfo: [=10=]) }
}
除了需要分叉 iOS SKD
之外,还没有发现这种方法的任何副作用
仅供参考,我在 AWS AppSync 论坛中发布了这个问题 originally(以防将来 AWS 回答)。
我一直在尝试制作一个简单的 Posts 应用程序,就像 docs 中的应用程序一样,但我没有找到在一个视图控制器中处理多个订阅的文档或指南。
三个突变:onCreatePost、onUpdatePost、onDeletePost (当然还有对这些突变的三个订阅)
在 Xcode 中,我在 viewDidLoad() 期间调用了三个函数:subscribeToNewPosts()、subscribeToUpdatedPosts()、subscribeToDeletedPosts()
每个订阅功能都可以工作并创建具有正确功能的订阅并相应地更新 table 视图 如果单独使用。但是,如果一个接一个地调用,只有最后一个订阅会实际接收数据并更新 table 视图。在订阅了所有三个突变
之后,我在 AppSyncMQTTClient.swift 中放置了一个断点来检查 topicSubscribersDictionaryfunc startNewSubscription(subscriptionInfo: AWSSubscriptionInfo) {
var topicQueue = [String]()
let mqttClient = MQTTClient<AnyObject, AnyObject>()
mqttClient.clientDelegate = self
for topic in subscriptionInfo.topics {
if topicSubscribersDictionary[topic] != nil {
// if the client wants subscriptions and is allowed we add it to list of subscribe
topicQueue.append(topic)
}
}
mqttClients.append(mqttClient)
mqttClientsWithTopics[mqttClient] = topicQueue
mqttClient.connect(withClientId: subscriptionInfo.clientId, toHost: subscriptionInfo.url, statusCallback: nil)
}
实际上所有三个订阅都在字典中...
我是否需要多个 appSyncClient 实例,每个订阅一个?是schema设计的问题吗?
示例用例:简单的聊天应用程序。新对话开始 = OnCreatePostSubscription;该对话中的新传入消息 = OnUpdatePostSubscription
您是否在 AppSync
中使用 API Key
进行授权?如果您使用 API Key
,此时 SDK 仅支持一个订阅。您能否切换到 IAM
(Cognito 身份)或基于 Cognito UserPools
的身份验证,看看多个订阅是否适合您?
通过在 AWSAppSyncSubscriptionWatcher
startSubscriptions
替换为 startNewSubscription
,我设法让多个订阅与 API Key
一起使用
if let subscriptionInfo = subscriptionResult.subscrptionInfo {
self.subscriptionTopic = subscriptionResult.newTopics
self.client?.addWatcher(watcher: self, topics: subscriptionResult.newTopics!, identifier: self.uniqueIdentifier)
//self.client?.startSubscriptions(subscriptionInfo: subscriptionInfo)
subscriptionInfo.forEach { self.client?.startNewSubscription(subscriptionInfo: [=10=]) }
}
除了需要分叉 iOS SKD
之外,还没有发现这种方法的任何副作用