截圖 2022-02-26 下午8.47.20

 

小賢 發表在 痞客邦 留言(0) 人氣()

 

小賢 發表在 痞客邦 留言(0) 人氣()

頁尾加入


    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/styles/atom-one-dark.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/highlight.min.js"></script>
    <!-- and it's easy to individually load additional languages -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/languages/go.min.js"></script>

    


截圖 2021-09-28 上午3.19.50

小賢 發表在 痞客邦 留言(0) 人氣()

ViewModel:

        

            import WebAPI
            import MVVM

            final class Page2ViewModel: ObservableObject, Refreshable, Updateable {

                @Published var isUpdate: Bool = false
                
                @Published private(set) var cellViewModels: [Page2CellViewModel] = []
                @Published private(set) var model: MainApodModel? {
                    didSet {
                        guard let model = model else {
                            return
                        }

                        cellViewModels = model.result.map { Page2CellViewModel(model: $0) }
                    }
                }

                func refresh() {

                    isUpdate = true

                    let parameter = MainApodParameter()

                    Task { @MainActor in
                        do {
                            let model: MainApodModel = try await MainApodWebAPI().invokeAsync(parameter)
                            
                            isUpdate = false
                            self.model = model
                            
                        } catch let error {

                            print(error.localizedDescription)

                            isUpdate = false
                        }
                    }
                }
            }
        

ViewController:

小賢 發表在 痞客邦 留言(0) 人氣()

        

import WebAPI
import MVVM

struct Page2ViewModel: Refreshable, Updateable, MutatingClosure {

    weak var binder: Binder?
    
    var isUpdate: Bool = false
    
    private(set) var cellViewModels: [Page2CellViewModel] = []
    private(set) var model: MainApodModel? {
        didSet {
            guard let model = model else {
                return
            }

            cellViewModels = model.result.map { Page2CellViewModel(model: $0) }
        }
    }
    
    init(binder: Binder)
    {
        self.binder = binder
        refresh()
    }

        
    mutating func refresh() {

        isUpdate = true

        let parameter = MainApodParameter()
        let copySelf = self

        Task { @MainActor in
            do {
                let model: MainApodModel = try await MainApodWebAPI().invokeAsync(parameter)
                
                copySelf.mutating { (mutatingSelf: inout Page2ViewModel) in
                    mutatingSelf.isUpdate = false
                    mutatingSelf.model = model
                }
                
            } catch let error {

                print(error.localizedDescription)

                copySelf.mutating { (mutatingSelf: inout Page2ViewModel) in
                    mutatingSelf.isUpdate = false
                }
            }
        }
    }
}

        
    

 

await之後是callback,這樣想就可以跟之前的做法接起來

小賢 發表在 痞客邦 留言(0) 人氣()