2

仅供参考,我最初在 AWS AppSync 论坛上发布了这个问题(以防 AWS 将来回答它)。

我一直在尝试制作一个简单的帖子应用程序,如文档中的那个,但我没有找到在一个视图控制器中处理多个订阅的文档或指南。

三个突变: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 实例,每个订阅一个?架构设计有问题吗?

架构.graphql

模式.json

突变.graphql

查询.graphql

订阅.graphql

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

4

2 回答 2

4

你在使用API Key授权AppSync吗?如果您只使用API Key一个订阅,此时 SDK 支持。您能否切换到IAM(Cognito Identity)或Cognito UserPools基于身份验证并查看多个订阅是否适合您?

于 2018-03-12T18:35:50.210 回答
0

API Key通过替换startSubscriptionsstartNewSubscriptioninside的调用,我设法使用了几个订阅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 之外,还没有发现这种方法有任何副作用

于 2018-05-15T13:44:37.253 回答