介绍Dyno🦕

更新:本系列的第二篇文章 现已发布

Dyno是一个正在构建的新Swift库用于:

为Amazon AWS DynamoDB数据库提供功能性,反应性,安全且易于使用的界面。

不必担心这是否有意义-或者说有意义但对您没有帮助-因为除了实用的步骤之外,我还将讨论一些想法和技术,希望它们可以在其他地方使用。

在此过程中,它将:

  • 将官方的AWS Python boto3库与Swift集成
  • 添加强大的异步处理
  • 通过反应性可观察流输出数据
  • 提供macOS和iOS的RxSwift扩展,以简单,声明性的方式将结果集成到您的应用中。

我还将介绍添加一些其他功能:

  • 离线数据存储和同步
  • DynamoDB某些高级功能的扩展。

附带的目的是说明我在以前的文章中一直看过的功能强大的工具如何能够带来巨大的实际收益。

我还计划在编写这些文章时开发此库。 Dyno源代码可在github上获得 (我将继续对其进行调整,将代码分支以匹配这些文章:本文位于Introduction分支下)因此,即使您仅对其中一些主题感兴趣,继续—并发表评论,并根据需要评论PR和明星😀!

Linux /非Apple /服务器端人员,我没有忘记您:即使其中的一些细节有所变化,此处的许多内容还是很有希望的。

本文

在本文中,我们将对这些概念进行一些基本介绍。 然后使用AWS DynamoDB进行设置。 这将是很多初始配置,但是我们完成了:我们将看到如何使用PythonKit从Swift中访问我们的新数据库。

我等不及要开始了! 🦕

认识人物

DynamoDB

DynamoDB是来自Amazon Web Services的高可用性和弹性云托管的NoSQL数据库。 它可以极大地扩展,但是对于小用例也是免费的,因此非常适合上手。

Boto3

Boto3是用于与DynamoDB通信的官方Amazon SDK。 它使用Python:其他语言(如Java和Go)可用,但没有Swift。 在Dyno中我们将利用Google Tensorflow团队开发的半官方 Python互操作性(它本身依赖于Swift 5的功能,因此这些文章仅是Swift5。我们将在短期内讨论如何处理该问题)。 )。

我还应该指出, AppSync平台具有对AWS和DynamoDB的AWS支持,该平台是一个复杂的交互库,对于某些应用程序将是一个不错的选择。 但是:它仅适用于iOS; 它非常重且复杂; 而且它不使用反应式编程技术-因此,我正在寻找更具兼容性,重量更轻且功能更多的产品。

观测和反应式编程

响应式编程以一种功能性的方式描述了数据流(“可观察对象”:可能是UI中的按钮单击,网络上的数据包或从云数据存储中检索到的结果),从而使我们能够使用运算符进行操作 。 这使我们可以使用声明式样式来开发整个应用程序。 Swift有两个可用的反应框架; 我使用RxSwift是因为我对它更加熟悉。

通过将DynamoDB中的数据作为Observable流返回,我们可以将结果附加到数据表中。 不仅如此:我们可以在数据加载时显示微调器; 错误消息失败消息; 以及其他许多简洁功能,只需观察流即可。 该代码确实需要一些时间来习惯,但这是值得的:

……这四行代码:检查应用程序是否刷新其数据存储或存储新数据; 在数据传输时显示微调框; 显示任何错误; 并在表格视图中显示刷新结果。 不需要太多代码,这真是强大!

反应性扩展

RxSwift为常见的UI对象添加了许多扩展,以允许它们与Observable流进行交互。 Dyno将添加更多内容,包括使它们与常见的macOS UI元素一起使用,并提供一些方便的运算符(例如–-> 绑定 Observable流,而..>进行处置)

入门

设置AWS

首先,如果您尚未设置AWS账户,则需要这样做。 这是一个复杂的过程,带您完成许多安全性选择。 作为设置的一部分,您将获得一个访问密钥ID和一个秘密访问密钥 :请注意这些(您不能重新获取您的秘密访问密钥),因为我们很快就会需要它们。 您可能还需要根据您所在的世界来设置区域。 最后,您需要提供一张信用卡以便他们可以向您收费:但是请放心,我们不应该收取任何容量费用,而应保留在免费套餐中!

设置DynamoDB

完成后,您就可以访问AWS管理控制台,搜索DynamoDB ,然后进入仪表板:

单击创建表,然后输入表名称。 我们称它为恐龙,并放入一个名为id的主键。 其他一切都可以保持不变。 单击创建以实际创建表。

注意:最佳做法是不要在数据库中使用名称作为主键,而应使用无意义的标识符

您将切换回仪表盘并创建表格-这可能需要一些时间,但是一旦完成,您将跳至选择了Dinosaur表格的Tables视图。 我建议对此视图进行更改,以避免计费费用:

  • 转到“容量”选项卡,然后将“读/写容量单位”更改为1

这就是我们目前需要的所有AWS,让我们来破解一些代码!

Python和Boto3

为了与我们刚刚建立的新数据库进行对话,我们将使用Amazon的boto3库。 这里有一些说明,但是基本上您需要转到终端并输入:

 > sudo easy_install pip 
> pip install boto3 --user

(如果系统上已经有pip,则可能不需要第一个命令;在第二个中,您可能还需要一个标志--ignore-installed six来忽略以前安装的软件包)

接下来,设置一个凭证文件。 创建目录~/.aws并在其中创建一个名为credentials的文件,如下所示:

 [default] 
aws_access_key_id=[your access key id from earlier]
aws_secret_access_key=[your secret access key from earlier]

我还必须为我的表安装在的区域设置一个这样的config文件:

 [default] 
region=us-east-2

完成所有设置后,让我们尝试一下。

 > python 

>>> import boto3
>>> dynamodb = boto3.resource("dynamodb")
>>> table = dynamodb.Table("Dinosaurs")
>>> table.scan()
{u'Count': 0, u'Items': [], u'ScannedCount': 0, 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId'...}}

…即使没有返回任何行,您也应该收到一条HTTPStatusCode为200的消息,表明该请求正常。 如果没有发生,请仔细检查,尤其是您的凭据设置。

最后,介绍一些Swift(第1部分)

我们在本文中要解决的最后一件事是在Swift中进行此工作。 为此,我们将利用一个名为PythonKit的库,该库是Pedro Vieto利用Google Tensorflow团队构建的Python互操作性库构建的包装器。 该团队已经为Swift核心语言引入了一些功能,从而使使用Python变得更加简单-这些功能已进入Swift 5之中 ……这意味着我们将需要做更多的设置并掌握Swift 5!

做到这一点的最简单方法(假设您在2019年春季的Swift 5正式发布之前已经阅读过此内容)是从Apple开发人员网站下载最新的Xcode Beta。 一旦下载并安装(恐怕还不很快),您将需要切换命令行Swift工具以使用新下载的文件:

 > sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer 

现在,我们将使用Swift软件包管理器来完成创建带有两个主要依赖项的XCode项目的艰苦工作: PythonKitRxSwift

因此,创建一个名为Dyno的新目录; 进入该目录并输入以下内容以设置新的SPM目录结构:

 > swift package init --type executable 

我们现在正在使用可执行结构,因此可以开始使用(欢呼!)

找到已创建的Package.swift文件,然后对其进行编辑,使其看起来像这样:

 // swift-tools-version:5.0 
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
name: "Dyno",
dependencies: [
.package(url: "https://github.com/pvieito/PythonKit.git", .branch("master")),
.package(url: "https://github.com/ReactiveX/RxSwift.git", "4.0.0" ..< "5.0.0")
],
targets: [
.target(
name: "Dyno",
dependencies: ["PythonKit","RxSwift"]),
.testTarget(
name: "DynoTests",
dependencies: ["Dyno"]),
]
)

然后,使用以下命令获取依赖关系并创建/打开Xcode项目:

 > swift package fetch 
> swift package generate-xcodeproj
> open Dyno.xcodeproj

最后,介绍一些Swift(第2部分,这次是实际的Swift)

main.swift添加以下内容:

 import PythonKit 

let boto3 = Python.import("boto3")
let dynamodb = boto3.resource("dynamodb")
let table = dynamodb.Table("Dinosaurs")
print( table.scan() )

令人惊讶的是,它将以与以前的Python代码相同的方式工作,从表中提取(公认不存在的)数据并显示连接信息。

您可能还想看看代码与原始Python版本的boto3 ,并确实尝试使用boto3库对该表进行更多操作-添加一些恐龙不是很好吗?

 table.put_item( 
Item:[
"id" : "1",
"name" : "Emojisaurus",
"colour" : "blue"
])

print( table.scan() )

🦕

下次

! 尽管最终确实发生了一些有趣的事情,但是这需要进行很多设置和配置。 下次,我们将实际使用API​​构建更多的库,以隐藏Pythonnessss并提供Swift接口! 🏎

更新:下一篇文章在这里:https://medium.com/@JLHLonline/dyno-aws-swifter-1ecaa1249924