Buzzler
NOTE: Side Project with 5 team members
1. Description
- 진행기간: 2018.04 ~ 2018.10
- 프로젝트 내용: 대학생을 위한 블록체인 기반의 SNS 어플리케이션
- 역할: iOS 앱 개발
- 사용한 Skill:
Swift
,MVVM
,RxSwift
2. Code Snippet
//
// LoginViewModel.swift
// Buzzler
//
// Created by 진형탁 on 2018. 4. 18..
// Copyright © 2018년 Buzzler. All rights reserved.
//
import UIKit
...
private let disposeBag = DisposeBag()
public protocol LoginViewModelInputs {
var email: PublishSubject<String?> { get}
var password: PublishSubject<String?> { get }
var loginTaps: PublishSubject<Void> { get }
}
public protocol LoginViewModelOutputs {
var validatedEmail: Driver<ValidationResult> { get }
var validatedPassword: Driver<ValidationResult> { get }
var enableLogin: Driver<Bool>{ get }
var signedIn: Driver<LoginResponse> { get }
var isLoading: Driver<Bool> { get }
}
public protocol LoginViewModelType {
var inputs: LoginViewModelInputs { get }
var outputs: LoginViewModelOutputs { get }
}
class LoginViewModel: LoginViewModelType, LoginViewModelInputs, LoginViewModelOutputs {
public var validatedEmail: Driver<ValidationResult>
public var validatedPassword: Driver<ValidationResult>
public var enableLogin: Driver<Bool>
public var loginTaps: PublishSubject<Void>
public var password: PublishSubject<String?>
public var email: PublishSubject<String?>
public var signedIn: Driver<LoginResponse>
public var isLoading: Driver<Bool>
public var inputs: LoginViewModelInputs { return self }
public var outputs: LoginViewModelOutputs { return self }
// Private
fileprivate let provider: RxMoyaProvider<Buzzler>
public init(provider: RxMoyaProvider<Buzzler>) {
self.provider = provider
self.email = PublishSubject<String?>()
self.password = PublishSubject<String?>()
self.loginTaps = PublishSubject<Void>()
let validationService = BuzzlerDefaultValidationService.sharedValidationService
self.validatedEmail = self.email
.asDriver(onErrorJustReturn: nil)
.flatMapLatest { email in
return validationService.validateUserId(email!)
.asDriver(onErrorJustReturn: .failed(message: "Error contacting server"))
}
self.validatedPassword = self.password
.asDriver(onErrorJustReturn: nil)
.map{ password in
return validationService.validateTextString(password!)
}
self.enableLogin = Driver
.combineLatest(validatedEmail, validatedPassword) { email, password in
return email.isValid && password.isValid
}
let emailAndPassword = Driver.combineLatest(self.email.asDriver(onErrorJustReturn: nil),
self.password.asDriver(onErrorJustReturn: nil)) { ($0,$1) }
let isLoading = ActivityIndicator()
self.isLoading = isLoading.asDriver()
self.signedIn = self.loginTaps
.asDriver(onErrorJustReturn:())
.withLatestFrom(emailAndPassword)
.flatMapLatest{ tuple in
return API.sharedAPI
.signIn(email: tuple.0!, password: tuple.1!)
.trackActivity(isLoading)
.asDriver(onErrorJustReturn: LoginResponse(error: ErrorResponse(code: 500, message: "Server Error!"), result: nil))
}
.flatMapLatest{ loginResult in
return API.sharedAPI
.getUserInfo(loginResult: loginResult)
.trackActivity(isLoading)
.asDriver(onErrorJustReturn: LoginResponse(error: ErrorResponse(code: 500, message: "Server Error!"), result: nil))
}
}
}
3. Demo
4. Images
Landing Page
앱 스크린샷