본문 바로가기

개발

Combine Publisher - Deferred

728x90

Combine에서 다른 퍼블리셔의 플레이스홀더 역할을 하는 퍼블리셔입니다. 구독자가 연결할 때까지 실제 퍼블리셔의 생성을 지연합니다. 이는 불필요한 퍼블리셔를 생성하지 않으려는 시나리오나 생성 로직이 구독 자체에 따라 달라질 때 유용할 수 있습니다.

다음은 세부 내용입니다.

  • 게시자 생성 지연: 즉시 생성되는 다른 게시자와 달리 기본 게시자를 생성하기 전에 구독자를 기다립니다.
  • 유연성: 클로저 내에서 실제 퍼블리셔에 대한 생성 로직을 정의할 수 있어 구독 컨텍스트에 따라 유연성을 제공합니다.
  • 사용 사례:

예: 사용자 인증 확인:

import Combine



func isUserLoggedIn() -> Deferred<PassthroughSubject<Bool, Never>, Never> {

  return Deferred {

    // Check user authentication status (replace with actual logic)

    let isLoggedIn = /* logic to check user login */

    return PassthroughSubject<Bool, Never>(value: isLoggedIn)

  }

}



// Use the Deferred publisher

isUserLoggedIn()

  .sink(receiveCompletion: { _ in }, receiveValue: { loggedIn in

    print("User is logged in: \(loggedIn)")

  })

 

이 예에서:

  1. isUserLoggedIn게시자 를 반환하는 함수입니다.
  2. Deferred클로저 내부에서 사용자 로그인 상태를 확인합니다. (실제 로직으로 대체하세요.)
  3. 로그인 상태에 따라 게시자 PassthroughSubject가 생성되어 반환됩니다. 이 게시자는 로그인 상태를 나타내는 단일 부울 값을 방출합니다.
  4. 우리는 게시자를 구독하는데 Deferred, 게시자는 기반 생성을 트리거 PassthroughSubject하고 로그인 상태를 내보냅니다.

키 포인트:

  • Deferred게으른 퍼블리셔 생성 메커니즘입니다.
  • 구독에 따라 게시자 행동을 정의하는 데 유연성을 제공합니다.
  • 게시자 생성을 최적화할 수 있거나 구독자 컨텍스트에 따라 달라지는 경우 사용을 고려하세요 .

기억하세요, Combine 툴박스의 도구 하나일 뿐입니다. 이를 전략적으로 사용하여 코드 효율성을 개선하고 애플리케이션에서 동적 퍼블리셔 생성 시나리오를 처리하세요.

 

물론, 다양한 시나리오에서 게시자를 만드는 데 Combine을 사용하는 방법에 대한 몇 가지 예는 다음과 같습니다 .

1. 네트워크 접근성 확인:

import Combine



func isNetworkReachable() -> Deferred<PassthroughSubject<Bool, Never>, Never> {

  return Deferred {

    // Check network reachability (replace with actual logic)

    let isReachable = /* logic to check network reachability */

    return PassthroughSubject<Bool, Never>(value: isReachable)

  }

}



// Use the Deferred publisher to update UI based on network status

isNetworkReachable()

  .sink(receiveCompletion: { _ in }, receiveValue: { isReachable in

    // Update UI elements based on network reachability

    updateNetworkStatusUI(isReachable: isReachable)

  })

 

2. 사용자 프로필 데이터 로딩:

import Combine



func loadUserProfileData(userId: String) -> Deferred<Future<UserProfile, Error>, Never> {

  return Deferred {

    // Load user profile data (replace with actual data fetching logic)

    let userProfile = /* logic to load user profile data */

    return Future { promise in

      // Simulate asynchronous data loading

      DispatchQueue.global().asyncAfter(deadline: .now() + 2) {

        promise(.success(userProfile))

      }

    }

  }

}



// Use the Deferred publisher to display user profile information

let userId = "12345"



loadUserProfileData(userId: userId)

  .sink(receiveCompletion: { completion in

    if case .failure(let error) = completion {

      print("Error loading user profile: \(error)")

    }

  }, receiveValue: { userProfile in

    // Display user profile information

    displayUserProfile(userProfile: userProfile)

  })

 

3. 사용자 정의 오류 게시자 만들기:

import Combine



enum CustomError: Error {

  case invalidInput

  case dataNotFound

}



func validateInput(input: String) -> Deferred<Future<Bool, CustomError>, Never> {

  return Deferred {

    // Validate input (replace with actual validation logic)

    let isValid = /* logic to validate input */

    if isValid {

      return Future { promise in

        promise(.success(true))

      }

    } else {

      return Future { promise in

        promise(.failure(.invalidInput))

      }

    }

  }

}



// Use the Deferred publisher to handle validation errors

let input = "some input"



validateInput(input: input)

  .sink(receiveCompletion: { completion in

    if case .failure(let error) = completion {

      print("Validation error: \(error)")

    }

  }, receiveValue: { isValid in

    if isValid {

      // Process valid input

      processInput(input)

    } else {

      // Handle invalid input

      handleInvalidInput()

    }

  })

 

설명:

  • 각 예제에서 우리는 게시자를 반환하는 함수를 정의합니다.
  • 폐쇄 Deferred에는 특정 시나리오에 따라 실제 퍼블리셔를 만드는 논리가 포함되어 있습니다.
  • 우리는 기본 퍼블리셔의 생성을 트리거하고 해당 동작을 실행하는 퍼블리셔를 구독합니다 .

키 포인트:

  • Deferred구독과 상황에 따라 게시자를 만드는 유연한 접근 방식을 제공합니다.
  • 이를 통해 불필요한 퍼블리셔 생성을 방지하고 동적인 퍼블리셔 동작이 가능해집니다.
  • 신중하게 사용하여 Deferred코드 구성을 개선하고 특정 조건에 따라 게시자 생성이 달라지는 시나리오를 처리합니다.

'개발' 카테고리의 다른 글

Combine Publisher - Fail  (0) 2024.07.08
Combine Publisher - Empty  (0) 2024.07.08
Combine Publisher - Future  (1) 2024.07.08
Combine Publisher - Just  (0) 2024.07.08
Publisher & Subscriber - Combine  (0) 2024.07.08