原创: 彭权华
首发:「知晓云」公众号 - 小程序开发快人一步
SwiftUI 是苹果最新推出的 UI 开发工具,其具有以下特点:采用声明式语法,易于阅读、代码更少;跨所有苹果平台,共用一套 API;自动支持动态类型、暗黑模式、本地化等。采用 SwiftUI 将大大提高 UI 界面开发效率。
在上篇文章 SwiftUI 入门实战(上)中我们已经学到了如何使用 SwiftUI 快速构建一个新闻资讯 app 页面。但其只是一个静态页面,不能满足我们随时需要更新资讯的需求。所以本篇小彭将为大家介绍如何使用知晓云动态发布新闻资讯,并在 app 获取到新闻资讯信息后,使用 SwiftUI 的 ObservableObject、@ObservedObject、@Published 等特性自动更新界面。
【关注「知晓云」公众号,回复关键字「SwiftUI」获取完整代码】
知晓云
实现实时发布信息的传统方式,需要搭建服务器、数据库,域名备案,数据接口实现等繁琐流程。使用知晓云能够免去这些步骤,使我们专注于业务逻辑的实现。我们只需要在知晓云创建一个应用和数据表,将数据存储到数据表中,在 app 能够方便快捷地操作这些数据。我们将使用知晓云来存储新闻资讯信息。
创建应用
前往知晓云注册知晓云账号。成功注册后,进入知晓云控制台 dashboard 页。创建应用,应用名称为 Daliy,套餐选择免费版。
创建数据表
选择左边侧栏数据模块,弹出创建数据表页面,数据表名称为 Daliy,设置数据表录入权限为 登录用户;设置行的默认读写权限为 所有人可读、登录用户可写。
为 Daliy 添加列,选择 添加列 ,在弹出页面输入 title 即可。
依次添加 author、date、content、thumbnail 列,类型为 string。
录入新闻资讯信息,选择 添加行,在弹出的界面录入信息:
MinCloud 安装与配置
App 获取知晓云上的信息,需要安装知晓云 SDK —— MinCloud。通过 Cocoapods 方便快捷安装 MinCloud,在 Daliy 项目根目录下,新建 Podfile 文件,并输入以下内容:
platform :ios, '9.0'use_frameworks!target 'MinCloud' do pod 'MinCloud', :git => 'https://github.com/ifanrx/hydrogen-ios-sdk.git'end
在终端进入项目根目录,并执行以下命令,完成安装:
pod install
初始化 MinCloud
在应用启动时,需要注册知晓云分配的 clientId,即在 AppDelegate.swift 文件中,导入 MinCloud,并找到 application:didFinishLaunchingWithOptions 方法,插入下面代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BaaS.register(clientID: "fdc4feb5403a985fe681") return true}
将 clientID 替换成你的应用 ID,clientID 可在 dashboard 设置-应用页中获取)。
从知晓云获取新闻资讯信息
创建一个 swift 文件,命名为 DaliyStore。在 MinCloud 中,Table 对应于知晓云的数据表,操作该对象相当于操作知晓云对应的数据表。在 DaliyStore.swift 文件,导入 MinCloud,并创建 DaliyStore 类。在 DaliyStore 类增加一个属性 daliyTable 。daliyTable 是一个 Table 实例,关联数据表 Daliy。
let daliyTable = Table(name: "Daliy")
新增一个属性 newList,为 News 数组,用于保存新闻资讯信息。
@Published var newsList: [News] = []
接下来我们可以通过 daliyTable 来操作数据表。实现 DaliyStore 类的方法 fetchDaliy(),该方法从知晓云数据表 Daliy 请求新闻资讯信息,并保存到 newsList 中。具体实现如下:
import Foundationimport MinCloudfinal class DaliyStore: ObservableObject { let daliyTable = Table(name: "Daliy") @Published var newsList: [News] = [] func fetchDalily() { daliyTable.find { (recordList, error) in var _newsList: [News] = [] recordList?.records?.forEach({ (record) in let id = record.Id let title = record.get(key: "title") as? String let author = record.get(key: "author") as? String let date = record.get(key: "date") as? String let content = record.get(key: "content") as? String let thumbnail = record.get(key: "thumbnail") as? String if let id = id, let title = title, let author = author, let date = date, let content = content, let thumbnail = thumbnail { let news = News(id: id, title: title, author: author, date: date, content: content, thumbnail: thumbnail) _newsList.append(news) } }) DispatchQueue.main.async { self.newsList = _newsList } } }}
struct NewsListView: View { @ObservedObject var store = DaliyStore() var body: some View { List(store.newsList) { (news) in NavigationLink(destination: NewsDetailView(news: news)) { NewsListRow(news: news) Text("Hello World") .foregroundColor(.red) .font(.system(size: 16)) } } .onAppear(perform: { self.store.fetchDalily() }) .navigationBarTitle("新闻资讯") }}
运行代码,我们可以看到首页显示了从知晓云获取的新闻信息。你可能觉得奇怪的是,当从知晓云获取到新闻信息后,并没有手动调用代码去更新页面,为什么能显示这些信息呢?这就是 ObseverableObject、@ObservedObject、@Published 起的作用。当 @ObservedObject 对象的 @Published 属性发生改变时,@ObservedObject 所在的视图也会自动更新 body。另外,@ObservedObject 对象必须实现 ObserverableObject 协议。
小结
通过本教程学习了 SwiftUI 的基础知识包括:View 协议、修饰器(modifier)、预览、数据流(@State、ObservableObject、@ObservedObject、@Published)、基本视图等,并且使用 SwiftUI 创建了新闻资讯列表页和详情页,实现数据和视图的交互。另外我们也学习了如何使用知晓云(MinCloud)存储数据,为 app 提供数据。想了解更多 SwiftUI 信息,可参考这里;想了解更多知晓云,可参考这里。
【关注「知晓云」公众号,点击菜单栏「知晓云」-「知晓课堂」,获取更多开发教程。】