BackgroundThread/后台线程, WeakSelf/弱引用 的使用

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 效果图:

猜你喜欢

转载自blog.csdn.net/u011193452/article/details/133359784