1. BackgroundThread 后台线程操作
1.1 实现
/// ViewModel 层
class BackgroundThreadViewModel: ObservableObject{
@Published var dataArray:[String] = []
/// 获取数据
func fetchData(){
DispatchQueue.global(qos: .background).async {
let newData = self.downloadData()
print("Check 1: \(Thread.isMainThread)")
print("Check 1: \(Thread.current)")
DispatchQueue.main.async {
self.dataArray = newData
print("Check 2: \(Thread.isMainThread)")
print("Check 2: \(Thread.current)")
}
}
}
/// 下载数据
private func downloadData() -> [String]{
var data: [String] = []
for x in 0..<100{
data.append("\(x)")
print(data)
}
return data
}
}
/// 后台线程
struct BackgroundThreadBootcamp: View {
@StateObject var vm = BackgroundThreadViewModel()
var body: some View {
ScrollView {
LazyVStack(spacing: 10) {
Text("Load Data")
.font(.largeTitle)
.fontWeight(.semibold)
.onTapGesture {
vm.fetchData()
}
ForEach(vm.dataArray, id: \.self) { item in
Text(item)
.font(.headline)
.foregroundColor(.orange)
}
}
}
}
}
2. WeakSelf 弱引用操作,解决循环引用,占用内存问题
2.1 实现
/// 弱引用
struct WeakSelfBootcamp: View {
@AppStorage("count") var count: Int?
init() {
self.count = 0
}
var body: some View {
NavigationView {
NavigationLink("Navigate",
destination: WeakSelfSecondScreen())
.navigationTitle("Screen 1")
}
.overlay(alignment: .topTrailing) {
Text("\(count ?? 0)")
.font(.largeTitle)
.padding()
.background(Color.green.cornerRadius(10))
}
}
}
/// 第二个页面
struct WeakSelfSecondScreen: View{
@StateObject var viewModel = WeakSelfSecondScreenViewModel()
var body: some View{
VStack {
Text("Second View")
.font(.largeTitle)
.foregroundColor(.red)
if let data = viewModel.data{
Text(data)
}
}
}
}
// ViewModel
class WeakSelfSecondScreenViewModel: ObservableObject{
@Published var data: String? = nil
init() {
print("Initialize now")
let currentCount = UserDefaults.standard.integer(forKey: "count")
UserDefaults.standard.set(currentCount + 1, forKey: "count")
getData()
}
deinit {
print("Deinitialize now")
let currentCount = UserDefaults.standard.integer(forKey: "count")
UserDefaults.standard.set(currentCount - 1, forKey: "count")
}
func getData(){
// weak self 解决循环引用,占用内存问题
DispatchQueue.main.asyncAfter(deadline: .now() + 100) { [weak self] in
self?.data = "New data !!!"
}
}
}
2.2 效果图: