SwiftUI学习笔记之异步数据请求

SwiftUI学习笔记之异步数据请求

方法一

方法描述:

结合使用 ObservableObject @Published @ObservedObject

  • ObservableObject

定义自己的Model时,实现该协议

  • @Published

在需要变更通知的属性上标记, 可以在属性值变化时, 通知到异步框架

  • @ObservedObject

在定义自定义Model的属性的时候, 给Model加上此标记, 异步框架会订阅此对象的所有通知(即被标记为 @Published 的所有属性)

示例代码

import SwiftUI

import Combine

class TextCache: ObservableObject {
    @Published var text: String?
    
    func clear() {
        self.text = nil
    }
    
    func updateText() {
        
        /// 这里使用异步延时模拟网络请求
        DispatchQueue.global().asyncAfter(deadline: DispatchTime.now().advanced(by: .seconds(1))) {
            DispatchQueue.main.async {
                self.text = Date().description(with: Locale(identifier: "zh-CN"))
            }
        }
    }
}

struct ContentView: View {

   
    @ObservedObject var cache: TextCache = TextCache()
    
    
    var body: some View {
        VStack {
            Text(cache.text ?? "等待更新时间")
                .frame(width: 300,
                       height: 44,
                       alignment: .center)
            Button(action: {
                self.cache.updateText()
            }) {
                Text("点击更新时间")
            }
            
            Button(action: {
                self.cache.clear()
            }) {
                Text("清除时间")
            }
        }
        .cornerRadius(8)
        .border(Color(.gray))
    }
}

代码说明

  • 首先定义了一个TextCache的Model, 和这个Model具有一个字符串类型的text属性
  • TextCache实现 ObservableObject协议, 并为text属性标记@Published的属性修饰(@PropertyWrapper, 是Swift 5.1引入的新特性),表示这个属性的变化会想异步框架发出对应的通知
  • 在自己的视图中, 定义好TextCache这个Model作为视图的一个属性,并标记上 @ObservedObject的属性修饰, 表示这个Model的所有通知都会被异步框架订阅
  • 在需要使用到TextCache的text属性的地方,直接使用即可(此处的text属性由于设定的是可选值, 所以用了 ?? 来放置一个默认的值)

效果

  • 界面初始显示:
    • 一行文本:等待更新时间
    • 两个按钮: 更新时间, 清除时间
  • 界面交互效果
    • 点击更新时间, 1s后第一行文本变为当前的系统时间
    • 点击清除时间, 第一行文本恢复 ‘等待更新时间’

方法二

未完待续…

你可能感兴趣的:(iOS开发,SwiftUI)