- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个原型(prototype)应用程序来评估 AWS-Amplify (DataStore) 在我们的下一个应用程序中的使用。尝试同步 2 个客户端时遇到问题。我按照此处教程的说明设置了 AWS-DataStore:https://docs.amplify.aws/lib/datastore/getting-started/q/platform/ios通过使用 Cocoapods。关于 Cocoapods 一切都按预期工作。我尝试了一些测试,也可以在上面的“操纵数据”链接下看到。我还做了“将数据同步到云”部分。我可以在 AWS 控制台的 dynamoDB 中查看我的数据。当我添加一个条目时,我可以在控制台中看到它一切都按预期工作,但在两种情况下我遇到了问题:
假设我有 2 个客户端 A 和 B(都运行 iOS 13 - 它是真实设备还是在模拟器上并不重要),我希望这些客户端保持同步。为此,我添加了一个 PostStore(我正在使用来自 atm 上方 AWS 链接的示例架构),如下所示:
import Foundation
import Combine
import SwiftUI
import Amplify
class PostStore: ObservableObject {
@Published private(set) var posts: [Post] = []
var postSubscription: AnyCancellable?
init() {
self.getAllPostsFromDataStore()
}
deinit {
self.unsubscribeFromDataStore()
}
func getAllPostsFromDataStore() {
Amplify.DataStore.query(Post.self) { (result) in
switch result {
case .success(let posts):
DispatchQueue.main.async {
print("Got \(posts.count) Posts from DataStore initially")
self.posts = posts
}
case .failure(let error):
print("Error getting Posts from DataStore: \(error.localizedDescription)")
}
}
}
func addRandomPostToDataStore() {
let post = Post.getRandomPost()
self.addPostToArray(post)
print("Fire: \(post.id)")
Amplify.DataStore.save(post) {
switch $0 {
case .success(let post):
print("Added post with id: \(post.id)")
case .failure(let error):
print("Error adding post with title: \(post.title) Error: \(error.localizedDescription)")
}
}
}
func deletePostFromDataStore(for indexSet: IndexSet) {
let postsToDelete = indexSet.map { self.posts[$0] }
self.posts.remove(atOffsets: indexSet)
for post in postsToDelete {
Amplify.DataStore.delete(post) { (result) in
switch result {
case .success():
print("Deleted Post from DataStore")
case .failure(let error):
print("Error deleting Post From DataStore: \(error)")
}
}
}
}
func subscribeToDataStore() {
postSubscription = Amplify.DataStore.publisher(for: Post.self)
.sink(receiveCompletion: { (completion) in
print("Completion!")
if case .failure(let error) = completion {
print("Subscription received Error: \(error.localizedDescription)")
}
}, receiveValue: { (changes) in
//print("Subscription received mutation: \(changes)")
print("\n\n\n")
print("\(try! changes.toJSON())")
print("\n\n\n")
// print("Changes!")
let newPost = try! changes.decodeModel(as: Post.self)
DispatchQueue.main.async {
switch changes.mutationType {
case "create":
// print("Create Subscription")
self.addPostToArray(newPost)
break
case "update":
print("Update Subscription")
self.updatePostInArray(newPost)
break
case "delete":
print("Delete Subscription")
self.deletePostFromArray(newPost)
break
default:
print("AnotherType?")
print(changes.mutationType)
break
}
}
print("\n")
})
}
func unsubscribeFromDataStore() {
postSubscription?.cancel()
}
private func addPostToArray(_ post: Post) {
if !self.posts.contains(post) {
self.posts.append(post)
}
}
private func deletePostFromArray(_ post: Post) {
if let index = self.posts.firstIndex(of: post) {
self.posts.remove(at: index)
}
}
private func updatePostInArray(_ post: Post) {
print("update?")
}
}
subscribeToDataStore
方法是通过 SwiftUI-View(在
onAppear
中)触发的,是这里的关键。如果我向客户端 A(缓慢)添加一些帖子,那么客户端 B 会收到所有更改并将其添加到存储中(我使用 SwiftUI View 将其可视化,但在本示例中并不重要)。这里没有问题,一切都按预期工作。
getAllPostsFromDataStore
每一个条目都被提取,我们很高兴再去一次。
WebsocketDidReceiveMessage - {MyObject}
然后我再次将对象记录在接收器“receiveValue”完成中:
{MyObject}
但是当快速(在短时间内)添加一些条目时,来自 Amplify 的日志消息有时看起来像这样:(这是订阅获取中缺少第一个“对象”的地方):
WebsocketDidReceiveMessage - {MyObject}
WebsocketDidReceiveMessage - {MyObject2}
然后我再次将对象记录在接收器“receiveValue”完成中,并且只有最后一个对象被记录:
{MyObject2}
好像是这样
{MyObject}
快速添加多个条目时被取消或其他东西。如上所述,当 B 处于飞行模式或没有连接时,仅获取最后添加的条目。 (但我也只收到
WebsocketDidReceiveMessage
的最后一条日志消息)。
最佳答案
关于ios - AWS Amplify - 同步数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62639120/
我不小心删除了我的放大前端并创建了一个新前端。如何将现有的放大后端导入新创建的放大应用项目文件夹? 我按照后端标签上的步骤操作 amplify init --appId(“您的新AMPLIFY APP
尝试从CLI和Amplify studio UI控制台运行。从CLI中,它显示以下错误-。从它给出的以下用户界面错误-。。我已经检查了IAM的角色和权限,可以确认角色和权限都是按要求分配的,而且配额限
我有 4 个相关的 AWS 账户(服务、开发、QA、产品)。我希望服务包含 CI/CD 管道并部署到环境特定帐户。我在每个环境帐户中设置了一个 IAM 用户以用于部署。使用 AWS Amplify C
我的网站在 amplify 中托管了 2 年。我一切正常,但现在证书突然过期了。根据亚马逊的说法,它应该会自动续订,但它并没有发生...... 我试图联系亚马逊解决这个问题,但他们会向你收取费用,让你
我有一个使用 google federate 登录的 AWS Amplify 应用程序。这是我的数据模型。 type TriadeMetric @model @auth(rules: [{allow:
我正在为一个看起来像这样的博客创建一个 Amplify Schema: type Post @model { id: ID! caption: String! src: Strin
我有 AWS Amplify Apps,目前密码存储在 Amplify 环境变量中。我正在尝试使用 AWS secret 管理器来存储我的 secret 并将其用于我的 Amplify 项目 我查看了
我正在尝试通过 Amplify SDK 将 Pinpoint Analytics 实现到现有的 React Native 应用程序中。我们拥有自己的 authN 和 authZ 实现的现有用户群,因此
当我的应用用户使用他们的电话号码注册时,我想向他们的电话号码发送欢迎消息 (SMS)。我找不到有关此特定任务的官方文档。 最佳答案 Amazon 让您可以做到这一点。假设您使用 Cognito 进行注
我正在使用 AWS Amplify 构建一个 Web 应用程序。我正在使用 Appsync 和 DynamoDb,并且已经定义了我的 GraphQL 架构。现在,Amplify 提供了通过从命令行运行
我正在使用此 Amplify 指南 https://aws-amplify.github.io/docs/js/tutorials/building-react-native-apps/#connec
我可以在本地将我的应用程序发布到 S3 存储桶并且该应用程序可以运行。但是通过 AWS Amplify 控制台(Web)部署在后端的构建步骤失败。 由于缺少配置文件或目录,后端的构建步骤失败。 {
我正在关注本教程,当我这样做时 amplify pull --appId --envName staging 它会打开 Amplify Admin UI,但我不知道用什么登录? 有没有其他人有这个问
我开始使用 Amplify 项目 amplify init 我创建了一个环境并将其命名为 env并选择 AWS 配置文件 default . 好像env指向 default轮廓。 有什么办法可以让我e
我是使用 AWS Amplify 的新手,我刚刚发布了我自己的前端 WebApp,它是用 React 开发的。我刚刚压缩了我的构建文件夹并将生成的 zip 文件放到 AWS 控制台中。它工作正常。 但
我目前正在使用 AWS Amplify 来管理我的前端。我一直在整个控制台中手动注入(inject)环境变量。 虽然我已经看到(至少在这种情况下),但环境变量已得到正确保护,如 AWS docs 中所
我目前正在使用 AWS Amplify 来管理我的前端。我一直在整个控制台中手动注入(inject)环境变量。 虽然我已经看到(至少在这种情况下),但环境变量已得到正确保护,如 AWS docs 中所
我看到很多文档和地方说要使用 aws-amplify-react但是在文档中开始使用 react 我看到了这个包 @aws-amplify/ui-react使用模块withAuthentication
我正在使用 aws amplify 并尝试在我的根目录中运行命令“amplify configure”,但一直收到此错误响应 amplify : File C:\Users\munet\AppData
测试 我正在通过启动程序“Gatsby Default Starter”试用 gatsby gatsby new test 在没有进行任何定制的情况下,我在本地主机上对其进行了测试,图像显示正常。 2
我是一名优秀的程序员,十分优秀!