Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Carthage integration #66

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Checkouts

Carthage/Build

Expand Down Expand Up @@ -90,3 +90,4 @@ Icon
Network Trash Folder
Temporary Items
.apdisk

1 change: 0 additions & 1 deletion .ruby-version

This file was deleted.

1 change: 0 additions & 1 deletion .swift-version

This file was deleted.

4 changes: 4 additions & 0 deletions Cartfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
github "ReactiveX/RxSwift" ~> 4.0
github "RxSwiftCommunity/RxAlamofire" ~> 4.4
github "Alamofire/Alamofire" ~> 4.8
github "RxSwiftCommunity/RxRealm"
5 changes: 5 additions & 0 deletions Cartfile.resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
github "Alamofire/Alamofire" "4.8.2"
github "ReactiveX/RxSwift" "4.5.0"
github "RxSwiftCommunity/RxAlamofire" "4.4.0"
github "RxSwiftCommunity/RxRealm" "0.7.7"
github "realm/realm-cocoa" "v3.14.0"
3,071 changes: 1,111 additions & 1,960 deletions CleanArchitectureRxSwift.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 0 additions & 10 deletions CleanArchitectureRxSwift.xcworkspace/contents.xcworkspacedata

This file was deleted.

9 changes: 3 additions & 6 deletions CleanArchitectureRxSwift/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,14 @@ import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let window = UIWindow(frame: UIScreen.main.bounds)

Application.shared.configureMainInterface(in: window)

self.window = window
return true
}

}
38 changes: 13 additions & 25 deletions CleanArchitectureRxSwift/Application/Application.swift
Original file line number Diff line number Diff line change
@@ -1,57 +1,45 @@
import Foundation
import Domain
import Foundation
import NetworkPlatform
import CoreDataPlatform
import RealmPlatform

final class Application {
static let shared = Application()

private let coreDataUseCaseProvider: Domain.UseCaseProvider
private let realmUseCaseProvider: Domain.UseCaseProvider
private let networkUseCaseProvider: Domain.UseCaseProvider

private init() {
self.coreDataUseCaseProvider = CoreDataPlatform.UseCaseProvider()
self.realmUseCaseProvider = RealmPlatform.UseCaseProvider()
self.networkUseCaseProvider = NetworkPlatform.UseCaseProvider()
realmUseCaseProvider = RealmPlatform.UseCaseProvider()
networkUseCaseProvider = NetworkPlatform.UseCaseProvider()
}

func configureMainInterface(in window: UIWindow) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let cdNavigationController = UINavigationController()
cdNavigationController.tabBarItem = UITabBarItem(title: "CoreData",
image: UIImage(named: "Box"),
selectedImage: nil)
let cdNavigator = DefaultPostsNavigator(services: coreDataUseCaseProvider,
navigationController: cdNavigationController,
storyBoard: storyboard)

let rmNavigationController = UINavigationController()
rmNavigationController.tabBarItem = UITabBarItem(title: "Realm",
image: UIImage(named: "Toolbox"),
selectedImage: nil)
image: UIImage(named: "Toolbox"),
selectedImage: nil)
let rmNavigator = DefaultPostsNavigator(services: realmUseCaseProvider,
navigationController: rmNavigationController,
storyBoard: storyboard)
navigationController: rmNavigationController,
storyBoard: storyboard)

let networkNavigationController = UINavigationController()
networkNavigationController.tabBarItem = UITabBarItem(title: "Network",
image: UIImage(named: "Toolbox"),
selectedImage: nil)
image: UIImage(named: "Toolbox"),
selectedImage: nil)
let networkNavigator = DefaultPostsNavigator(services: networkUseCaseProvider,
navigationController: networkNavigationController,
storyBoard: storyboard)
navigationController: networkNavigationController,
storyBoard: storyboard)

let tabBarController = UITabBarController()
tabBarController.viewControllers = [
cdNavigationController,
rmNavigationController,
networkNavigationController
rmNavigationController,
networkNavigationController,
]
window.rootViewController = tabBarController

cdNavigator.toPosts()
rmNavigator.toPosts()
networkNavigator.toPosts()
}
Expand Down
2 changes: 1 addition & 1 deletion CleanArchitectureRxSwift/Common/ViewModelType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ import Foundation
protocol ViewModelType {
associatedtype Input
associatedtype Output

func transform(input: Input) -> Output
}
14 changes: 7 additions & 7 deletions CleanArchitectureRxSwift/Scenes/AllPosts/PostItemViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@
// Copyright © 2017 sergdort. All rights reserved.
//

import Foundation
import Domain
import Foundation

final class PostItemViewModel {
let title:String
let subtitle : String
final class PostItemViewModel {
let title: String
let subtitle: String
let post: Post
init (with post:Post) {
init(with post: Post) {
self.post = post
self.title = post.title.uppercased()
self.subtitle = post.body
title = post.title.uppercased()
subtitle = post.body
}
}
13 changes: 6 additions & 7 deletions CleanArchitectureRxSwift/Scenes/AllPosts/PostTableViewCell.swift
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import UIKit

final class PostTableViewCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var detailsLabel: UILabel!
func bind(_ viewModel:PostItemViewModel) {
self.titleLabel.text = viewModel.title
self.detailsLabel.text = viewModel.subtitle
@IBOutlet var titleLabel: UILabel!
@IBOutlet var detailsLabel: UILabel!

func bind(_ viewModel: PostItemViewModel) {
titleLabel.text = viewModel.title
detailsLabel.text = viewModel.subtitle
}

}
6 changes: 3 additions & 3 deletions CleanArchitectureRxSwift/Scenes/AllPosts/PostsNavigator.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import UIKit
import Domain
import UIKit

protocol PostsNavigator {
func toCreatePost()
Expand All @@ -19,7 +19,7 @@ class DefaultPostsNavigator: PostsNavigator {
self.navigationController = navigationController
self.storyBoard = storyBoard
}

func toPosts() {
let vc = storyBoard.instantiateViewController(ofType: PostsViewController.self)
vc.viewModel = PostsViewModel(useCase: services.makePostsUseCase(),
Expand All @@ -30,7 +30,7 @@ class DefaultPostsNavigator: PostsNavigator {
func toCreatePost() {
let navigator = DefaultCreatePostNavigator(navigationController: navigationController)
let viewModel = CreatePostViewModel(createPostUseCase: services.makePostsUseCase(),
navigator: navigator)
navigator: navigator)
let vc = storyBoard.instantiateViewController(ofType: CreatePostViewController.self)
vc.viewModel = viewModel
let nc = UINavigationController(rootViewController: vc)
Expand Down
31 changes: 14 additions & 17 deletions CleanArchitectureRxSwift/Scenes/AllPosts/PostsViewController.swift
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import UIKit
import Domain
import RxSwift
import RxCocoa
import RxSwift
import UIKit

class PostsViewController: UIViewController {
private let disposeBag = DisposeBag()

var viewModel: PostsViewModel!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var createPostButton: UIBarButtonItem!
@IBOutlet var tableView: UITableView!
@IBOutlet var createPostButton: UIBarButtonItem!

override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
bindViewModel()
}

private func configureTableView() {
tableView.refreshControl = UIRefreshControl()
tableView.estimatedRowHeight = 64
tableView.rowHeight = UITableView.automaticDimension
}

private func bindViewModel() {
assert(viewModel != nil)
let viewWillAppear = rx.sentMessage(#selector(UIViewController.viewWillAppear(_:)))
Expand All @@ -30,17 +30,17 @@ class PostsViewController: UIViewController {
let pull = tableView.refreshControl!.rx
.controlEvent(.valueChanged)
.asDriver()

let input = PostsViewModel.Input(trigger: Driver.merge(viewWillAppear, pull),
createPostTrigger: createPostButton.rx.tap.asDriver(),
selection: tableView.rx.itemSelected.asDriver())
createPostTrigger: createPostButton.rx.tap.asDriver(),
selection: tableView.rx.itemSelected.asDriver())
let output = viewModel.transform(input: input)
//Bind Posts to UITableView
output.posts.drive(tableView.rx.items(cellIdentifier: PostTableViewCell.reuseID, cellType: PostTableViewCell.self)) { tv, viewModel, cell in
// Bind Posts to UITableView
output.posts.drive(tableView.rx.items(cellIdentifier: PostTableViewCell.reuseID, cellType: PostTableViewCell.self)) { _, viewModel, cell in
cell.bind(viewModel)
}.disposed(by: disposeBag)
//Connect Create Post to UI
// Connect Create Post to UI

output.fetching
.drive(tableView.refreshControl!.rx.isRefreshing)
.disposed(by: disposeBag)
Expand All @@ -52,6 +52,3 @@ class PostsViewController: UIViewController {
.disposed(by: disposeBag)
}
}



18 changes: 9 additions & 9 deletions CleanArchitectureRxSwift/Scenes/AllPosts/PostsViewModel.swift
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import Foundation
import Domain
import RxSwift
import Foundation
import RxCocoa
import RxSwift

final class PostsViewModel: ViewModelType {

struct Input {
let trigger: Driver<Void>
let createPostTrigger: Driver<Void>
let selection: Driver<IndexPath>
}

struct Output {
let fetching: Driver<Bool>
let posts: Driver<[PostItemViewModel]>
Expand All @@ -20,33 +20,33 @@ final class PostsViewModel: ViewModelType {

private let useCase: PostsUseCase
private let navigator: PostsNavigator

init(useCase: PostsUseCase, navigator: PostsNavigator) {
self.useCase = useCase
self.navigator = navigator
}

func transform(input: Input) -> Output {
let activityIndicator = ActivityIndicator()
let errorTracker = ErrorTracker()
let posts = input.trigger.flatMapLatest {
return self.useCase.posts()
self.useCase.posts()
.trackActivity(activityIndicator)
.trackError(errorTracker)
.asDriverOnErrorJustComplete()
.map { $0.map { PostItemViewModel(with: $0) } }
}

let fetching = activityIndicator.asDriver()
let errors = errorTracker.asDriver()
let selectedPost = input.selection
.withLatestFrom(posts) { (indexPath, posts) -> Post in
return posts[indexPath.row].post
posts[indexPath.row].post
}
.do(onNext: navigator.toPost)
let createPost = input.createPostTrigger
.do(onNext: navigator.toCreatePost)

return Output(fetching: fetching,
posts: posts,
createPost: createPost,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@
// Copyright (c) 2017 sergdort. All rights reserved.
//


import Domain
import Foundation
import UIKit
import Domain

protocol CreatePostNavigator {

func toPosts()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import UIKit
import Domain
import RxSwift
import RxCocoa
import RxSwift
import UIKit

final class CreatePostViewController: UIViewController {
private let disposeBag = DisposeBag()

var viewModel: CreatePostViewModel!

@IBOutlet weak var cancelButton: UIBarButtonItem!
@IBOutlet weak var saveButton: UIBarButtonItem!
@IBOutlet weak var titleTextField: UITextField!
@IBOutlet weak var detailsTextView: UITextView!
@IBOutlet var cancelButton: UIBarButtonItem!
@IBOutlet var saveButton: UIBarButtonItem!
@IBOutlet var titleTextField: UITextField!
@IBOutlet var detailsTextView: UITextView!

override func viewDidLoad() {
super.viewDidLoad()
let input = CreatePostViewModel.Input(cancelTrigger: cancelButton.rx.tap.asDriver(),
saveTrigger: saveButton.rx.tap.asDriver(),
title: titleTextField.rx.text.orEmpty.asDriver(),
details: detailsTextView.rx.text.orEmpty.asDriver())

let output = viewModel.transform(input: input)

output.dismiss.drive()
.disposed(by: disposeBag)
output.saveEnabled.drive(saveButton.rx.isEnabled)
Expand Down
Loading