Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

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等はしないだろう。