Combine
細かいことは無視してひとまず動かしてみる例を勉強してみた。
JSONを読み込む用のモデル
struct Article: Codable { let title:String let url:String }
読み込む
func fetchArticles() -> AnyPublisher<[Article], Error> { let url = URL(string: "https://qiita.com/api/v2/items")! let request = URLRequest(url:url) return URLSession.shared .dataTaskPublisher(for: request) .map({$0.data}) .decode(type: [Article].self, decoder: JSONDecoder()) .eraseToAnyPublisher() }
無理やり表示させてみる。
import SwiftUI import Combine var cancels = [AnyCancellable]() struct ContentView: View { @State var tex = "x" var body: some View { VStack { Button(action: { fetchArticles() .sink(receiveCompletion: {_ in }) { articles in self.tex = articles.description }.store(in: &cancels) }) { Text("a") } Text(tex) } } }
これでひとまず動かせた。 AnyPublisherがRxSwiftのObject的なもの sinkで購読、storeでキャンセル待ちを保存しておく。 実際の実装ではViewでfetch等はしないだろう。