【干货】如何在 3 分钟内使用 SwiftUI 开发一个新闻资讯 app(下)

avatar
@爱范儿

原创: 彭权华
首发:「知晓云」公众号 - 小程序开发快人一步

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            }        }    }}
返回 NewsListView.swift 文件,之前新闻资讯是从 daliy.plist 文件获取,现在改为从知晓云获取。在 NewListView 类中删除属性 newList,新增 store 属性,类型为 DaliyStore。List 的数据源改为 store.newsList。在 List 出现时(onAppear)调用 store 的 fetchDaliy() 方法获取新闻资讯信息。
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 信息,可参考这里;想了解更多知晓云,可参考这里

【关注「知晓云」公众号,点击菜单栏「知晓云」-「知晓课堂」,获取更多开发教程。】