[swift] RxSwift를 사용한 소셜 미디어 연동 방법

이번 포스트에서는 RxSwift를 사용하여 소셜 미디어와의 연동 방법을 알아보겠습니다. 소셜 미디어 (예: 페이스북, 트위터)와의 연동은 대부분 비동기적인 작업을 수행해야 하므로, RxSwift와 함께 사용하면 매우 효과적으로 구현할 수 있습니다.

1. 소셜 미디어 로그인 기능 구현하기

첫 번째로, 소셜 미디어 로그인 기능을 구현해보겠습니다. 예를 들어, 페이스북 로그인을 구현한다고 가정해봅시다.

import RxSwift
import RxCocoa
import FacebookLogin

func loginWithFacebook() -> Observable<User> {
    return Observable.create { observer in
        let loginManager = LoginManager()
        loginManager.logIn(permissions: [.publicProfile], viewController: nil) { (result) in
            switch result {
            case .cancelled:
                observer.onError(SocialMediaError.cancelled)
            case .failed(let error):
                observer.onError(error)
            case .success(let result):
                if let token = result.token {
                    let user = User(id: token.userID, name: "John Doe") // 페이스북에서 받아온 사용자 정보
                    observer.onNext(user)
                    observer.onCompleted()
                } else {
                    observer.onError(SocialMediaError.unknown)
                }
            }
        }
        return Disposables.create {
            loginManager.logOut()
        }
    }
}

struct User {
    let id: String
    let name: String
}

enum SocialMediaError: Error {
    case cancelled
    case unknown
}

위 예제에서는 RxSwift의 Observable을 사용하여 소셜 미디어 로그인 기능을 구현했습니다. loginWithFacebook 함수는 페이스북 로그인 매니저를 사용하여 로그인을 시도하고, 결과를 Observable에 담아서 리턴합니다. 이후 결과에 따라 로그인이 성공하면 사용자 정보 User를 방출하고, 로그인이 실패하면 에러를 방출합니다.

2. 소셜 미디어 연동 후 데이터 가져오기

소셜 미디어에 연동 후에는 사용자의 정보나 친구 목록과 같은 데이터를 가져올 수 있습니다. 예를 들어, 페이스북의 프로필 정보를 가져오는 방법을 알아보겠습니다.

import RxSwift
import RxCocoa
import FacebookCore
import FacebookLogin

func getFacebookProfileInfo() -> Observable<UserProfile> {
    return Observable.create { observer in
        let graphRequest = GraphRequest(graphPath: "me", parameters: ["fields": "id,name"])
        _ = graphRequest.start { (connection, result, error) in
            if let error = error {
                observer.onError(error)
            } else if let result = result as? [String: Any] {
                if let id = result["id"] as? String, let name = result["name"] as? String {
                    let userProfile = UserProfile(id: id, name: name)
                    observer.onNext(userProfile)
                    observer.onCompleted()
                } else {
                    observer.onError(SocialMediaError.unknown)
                }
            }
        }
        return Disposables.create()
    }
}

struct UserProfile {
    let id: String
    let name: String
}

위 코드에서는 페이스북의 Graph API를 사용하여 사용자의 프로필 정보를 가져옵니다. getFacebookProfileInfo 함수를 호출하면, GraphRequest 객체를 생성한 후에 start 메서드를 호출하여 결과 데이터를 가져올 수 있습니다. 이후 결과에 따라 프로필 정보가 정상적으로 가져와지면 UserProfile 객체를 방출하고, 실패하면 에러를 방출합니다.

결론

이렇게 RxSwift를 사용하여 소셜 미디어와의 연동 기능을 구현할 수 있습니다. 비동기적인 작업을 쉽게 처리할 수 있고, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.