Combine for Networking

이세진·2022년 9월 20일
0

iOS

목록 보기
43/46
post-custom-banner

Combine을 활용하면 서버와의 네트워킹을 보다 간편하게 할 수 있다.

[
	{
	"userId": 1,
	"id": 1,
	"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
	"body": "quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto"
	},
	{
	"userId": 1,
	"id": 2,
	"title": "qui est esse",
	"body": "est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis qui aperiam non debitis possimus qui neque nisi nulla"
	}
...
]

jsonplaceholder의 더미 데이터를 활용하여 실습하였다.

Combine을 사용하여 서버 통신

struct Post: Codable {
    let userId: Int
    let id: Int
    let title: String
    let body: String
}

func getPosts() -> AnyPublisher<[Post], Error> {
    guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { fatalError("Invalid URL") }
    
    return URLSession.shared.dataTaskPublisher(for: url).map { $0.data }
        .decode(type: [Post].self, decoder: JSONDecoder())
        .eraseToAnyPublisher()
}

let cancellable = getPosts().sink(receiveCompletion: { _ in }, receiveValue: { print($0) })

// 출력값
// [__lldb_expr_295.Post(userId: 1, id: 1, title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"), 
// __lldb_expr_295.Post(userId: 1, id: 2, title: "qui est esse", body: "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"), 
// __lldb_expr_295.Post(userId: 1, id: 3, title: "ea molestias quasi exercitationem repellat qui ipsa sit aut", body: "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"),
// ...
  1. JSON 형식에 맞게 Codable을 채택한 구조체 모델 Post를 생성한다.
  2. getPosts 함수를 생성하고 리턴 타입으로 Post 어레이를 publish하는 AnyPublisher를 설정한다.
  3. URLSession.shared.dataTaskPublisher(for: url) 을 통해 서버 통신의 비동기 처리를 할 수 있다.
  4. decode를 통해 원하는 모델로 디코딩
  5. eraseToAnyPublisher()로 타입을 AnyPublisher로 변환
  6. AnyCancellable 객체 생성하고 sink 하기

Post 어레이가 잘 출력되는 것을 확인 할 수 있다.

UI작업을 원한다면 decode(…)이후에 .receive(on: RunLoop.main) 을 추가하여 메인 스레드에서 작업이 진행되도록 한다.

profile
나중은 결코 오지 않는다.
post-custom-banner

0개의 댓글