AWS AppSync在同一视图控制器中的多个订阅无法正常工作 - iOS Swift

时间:2018-03-10 18:00:51

标签: ios swift amazon-web-services graphql aws-appsync

仅供参考我在AWS AppSync论坛中发布了此问题originally(以防AWS将来回答)。

我一直在努力创建一个简单的帖子应用程序,就像docs中的那个,但我找不到在一个视图控制器中处理多个订阅的文档或指南。

三个突变:onCreatePost,onUpdatePost,onDeletePost (当然还有三个订阅这些突变)

在Xcode中,我在viewDidLoad()期间调用了三个函数:subscribeToNewPosts(),subscribeToUpdatedPosts(),subscribeToDeletedPosts()

每个订阅功能都可以运行并创建具有正确功能的订阅,并相应地更新表格视图如果单独使用。但是,如果一个接一个地调用,则只有最后一个订阅实际上会接收数据并更新表视图。在订阅所有三个突变后,我在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.graphql

schema.json

mutations.graphql

queries.graphql

subscriptions.graphql

示例用例:简单的聊天应用。新会话开始= OnCreatePostSubscription;该对话中的新传入消息= OnUpdatePostSubscription

2 个答案:

答案 0 :(得分:4)

您是否在API Key中使用AppSync进行授权?如果您使用的是API Key,则此时SDK仅支持一个订阅。您可以切换到IAM(Cognito Identity)或基于Cognito UserPools的身份验证,看看多个订阅是否适合您?

答案 1 :(得分:0)

我设法让多个订阅与API Key合作,将startSubscriptions内的startNewSubscription调用替换为AWSAppSyncSubscriptionWatcher

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: $0) }
}

除了要求分叉iOS SKD

之外,还没有找到这种方法的任何副作用