├── Cartfile ├── Cartfile.resolved ├── Default-568h@2x.png ├── RxFluxExample ├── Model.swift ├── AppDelegate.swift ├── Info.plist ├── APIClient.swift └── ModelTableViewController.swift ├── .gitignore └── RxFluxExample.xcodeproj └── project.pbxproj /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" ~> 3.0 2 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" "3.4.1" 2 | -------------------------------------------------------------------------------- /Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/morishin/RxFluxExample/HEAD/Default-568h@2x.png -------------------------------------------------------------------------------- /RxFluxExample/Model.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct Model { 4 | let name: String 5 | } 6 | 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Carthage 2 | 3 | # Created by https://www.gitignore.io/api/xcode 4 | 5 | ### Xcode ### 6 | # Xcode 7 | # 8 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 9 | 10 | ## Build generated 11 | build/ 12 | DerivedData/ 13 | 14 | ## Various settings 15 | *.pbxuser 16 | !default.pbxuser 17 | *.mode1v3 18 | !default.mode1v3 19 | *.mode2v3 20 | !default.mode2v3 21 | *.perspectivev3 22 | !default.perspectivev3 23 | xcuserdata/ 24 | 25 | ## Other 26 | *.moved-aside 27 | *.xccheckout 28 | *.xcscmblueprint 29 | 30 | ### Xcode Patch ### 31 | *.xcodeproj/* 32 | !*.xcodeproj/project.pbxproj 33 | !*.xcodeproj/xcshareddata/ 34 | !*.xcworkspace/contents.xcworkspacedata 35 | /*.gcno 36 | 37 | # End of https://www.gitignore.io/api/xcode 38 | -------------------------------------------------------------------------------- /RxFluxExample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | @UIApplicationMain 4 | class AppDelegate: UIResponder, UIApplicationDelegate { 5 | var window: UIWindow? 6 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 7 | window = UIWindow(frame: UIScreen.main.bounds) 8 | let viewController = ViewController() 9 | let navigationController = UINavigationController(rootViewController: viewController) 10 | window?.rootViewController = navigationController 11 | window?.makeKeyAndVisible() 12 | return true 13 | } 14 | } 15 | 16 | fileprivate class ViewController: UIViewController { 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | let button = UIButton() 20 | button.setTitle("Next", for: .normal) 21 | button.setTitleColor(.blue, for: .normal) 22 | button.sizeToFit() 23 | view.backgroundColor = .white 24 | view.addSubview(button) 25 | button.center = view.center 26 | button.addTarget(self, action: #selector(didTapButton(_:)), for: .touchUpInside) 27 | } 28 | func didTapButton(_ sender: UIButton) { 29 | let controller = ModelTableViewController() 30 | navigationController?.pushViewController(controller, animated: true) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /RxFluxExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIRequiredDeviceCapabilities 24 | 25 | armv7 26 | 27 | UISupportedInterfaceOrientations 28 | 29 | UIInterfaceOrientationPortrait 30 | 31 | UISupportedInterfaceOrientations~ipad 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationPortraitUpsideDown 35 | UIInterfaceOrientationLandscapeLeft 36 | UIInterfaceOrientationLandscapeRight 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /RxFluxExample/APIClient.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import RxSwift 3 | 4 | enum NextPage { 5 | case nextPage(Int) 6 | case reachedLast 7 | } 8 | 9 | struct ModelRequest { 10 | let page: Int 11 | 12 | struct Response { 13 | var models: [Model] 14 | var nextPage: NextPage 15 | } 16 | } 17 | 18 | struct MockClient { 19 | static let stubResponse: [ModelRequest: ModelRequest.Response] = [ 20 | ModelRequest(page: 1): ModelRequest.Response( 21 | models: (0..<20).map { Model(name: "No. \($0)") }, 22 | nextPage: .nextPage(2) 23 | ), 24 | ModelRequest(page: 2): ModelRequest.Response( 25 | models: (20..<40).map { Model(name: "No. \($0)") }, 26 | nextPage: .nextPage(3) 27 | ), 28 | ModelRequest(page: 3): ModelRequest.Response( 29 | models: (40..<50).map { Model(name: "No. \($0)") }, 30 | nextPage: .reachedLast 31 | ), 32 | ] 33 | 34 | static func response(to request: ModelRequest) -> Single { 35 | if let response = stubResponse[request] { 36 | return Single.create { observer -> Disposable in 37 | DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: { 38 | observer(.success(response)) 39 | }) 40 | return Disposables.create() 41 | } 42 | } else { 43 | return Single.create { observer -> Disposable in 44 | DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: { 45 | observer(.error(MockClientError.error)) 46 | }) 47 | return Disposables.create() 48 | } 49 | } 50 | } 51 | 52 | enum MockClientError: Error { 53 | case error 54 | } 55 | } 56 | 57 | extension ModelRequest: Hashable { 58 | var hashValue: Int { 59 | return page 60 | } 61 | } 62 | 63 | func == (lhs: ModelRequest, rhs: ModelRequest) -> Bool { 64 | return lhs.page == rhs.page 65 | } 66 | -------------------------------------------------------------------------------- /RxFluxExample/ModelTableViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import RxSwift 3 | import RxCocoa 4 | 5 | fileprivate struct State { 6 | enum NetworkState { 7 | case nothing 8 | case requesting 9 | case error(Error) 10 | } 11 | 12 | static let initialPage: Int = 1 13 | var models: [Model] 14 | var nextPage: NextPage 15 | var networkState: NetworkState 16 | } 17 | 18 | fileprivate enum Action { 19 | case refreshed(models: [Model], nextPage: NextPage) 20 | case loadedMore(models: [Model], nextPage: NextPage) 21 | case requested 22 | case errorOccured(error: Error) 23 | } 24 | 25 | fileprivate class Store { 26 | static let initialState = State( 27 | models: [], 28 | nextPage: .nextPage(State.initialPage), 29 | networkState: .nothing 30 | ) 31 | 32 | var states: Observable = .empty() 33 | var currentState: State { 34 | return try! stateCache.value() 35 | } 36 | 37 | private let stateCache: BehaviorSubject = BehaviorSubject(value: Store.initialState) 38 | 39 | init(inputs: Observable) { 40 | states = inputs 41 | .flatMap { event in ActionCreator.action(for: event, store: self) } 42 | .scan(Store.initialState, accumulator: Store.reduce) 43 | .multicast(stateCache) 44 | .refCount() 45 | } 46 | 47 | static func reduce(state: State, action: Action) -> State { 48 | var nextState = state 49 | 50 | switch action { 51 | case let .refreshed(models, nextPage): 52 | nextState.models = models 53 | nextState.nextPage = nextPage 54 | nextState.networkState = .nothing 55 | case let .loadedMore(models, nextPage): 56 | nextState.models += models 57 | nextState.nextPage = nextPage 58 | nextState.networkState = .nothing 59 | case .requested: 60 | nextState.networkState = .requesting 61 | case let .errorOccured(error): 62 | nextState.networkState = .error(error) 63 | } 64 | 65 | return nextState 66 | } 67 | } 68 | 69 | fileprivate struct ActionCreator { 70 | static func action(for event: View.Event, store: Store) -> Observable { 71 | let currentState = store.currentState 72 | 73 | switch event { 74 | case .firstViewWillAppear: 75 | if case .requesting = currentState.networkState { 76 | return Observable.just(.requested) 77 | } else { 78 | let request = ModelRequest(page: State.initialPage) 79 | let response: Single = MockClient.response(to: request) 80 | return response.asObservable() 81 | .map { response -> Action in 82 | return .refreshed(models: response.models, nextPage: response.nextPage) 83 | } 84 | .catchError { error -> Observable in 85 | return .just(.errorOccured(error: error)) 86 | } 87 | .startWith(.requested) 88 | } 89 | case .reachedBottom: 90 | switch currentState.nextPage { 91 | case .reachedLast: 92 | return .empty() 93 | case let .nextPage(nextPage): 94 | if case .requesting = currentState.networkState { 95 | return .just(.requested) 96 | } 97 | let request = ModelRequest(page: nextPage) 98 | let response: Single = MockClient.response(to: request) 99 | return response.asObservable() 100 | .map { response -> Action in 101 | return .loadedMore(models: response.models, nextPage: response.nextPage) 102 | } 103 | .catchError { error -> Observable in 104 | return .just(.errorOccured(error: error)) 105 | } 106 | .startWith(.requested) 107 | } 108 | } 109 | } 110 | } 111 | 112 | typealias View = ModelTableViewController 113 | class ModelTableViewController: UIViewController, UITableViewDataSource { 114 | fileprivate enum Event { 115 | case firstViewWillAppear 116 | case reachedBottom 117 | } 118 | 119 | private let store: Store 120 | private let events = PublishSubject() 121 | private let tableView = UITableView() 122 | private let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray) 123 | private let disposeBag = DisposeBag() 124 | 125 | private var models: [Model] = [] 126 | 127 | init() { 128 | store = Store(inputs: events) 129 | super.init(nibName: nil, bundle: nil) 130 | } 131 | 132 | override func viewDidLoad() { 133 | super.viewDidLoad() 134 | 135 | store.states 136 | .observeOn(MainScheduler.instance) 137 | .subscribe(onNext: self.render) 138 | .disposed(by: disposeBag) 139 | 140 | view.addSubview(tableView) 141 | tableView.frame = view.bounds 142 | tableView.dataSource = self 143 | tableView.register(UITableViewCell.self, forCellReuseIdentifier: String(describing: UITableViewCell.self)) 144 | 145 | view.addSubview(activityIndicator) 146 | activityIndicator.center = view.center 147 | 148 | rx.sentMessage(#selector(viewWillAppear)) 149 | .take(1) 150 | .subscribe(onNext: { [weak self] _ in 151 | self?.events.onNext(.firstViewWillAppear) 152 | }) 153 | .disposed(by: disposeBag) 154 | 155 | tableView.rx.willDisplayCell 156 | .subscribe(onNext: { [weak self] (cell, indexPath) in 157 | guard let strongSelf = self else { return } 158 | if indexPath.row == strongSelf.tableView.numberOfRows(inSection: indexPath.section) - 1 { 159 | strongSelf.events.onNext(.reachedBottom) 160 | } 161 | }) 162 | .disposed(by: disposeBag) 163 | } 164 | 165 | required init?(coder aDecoder: NSCoder) { 166 | fatalError("init(coder:) has not been implemented") 167 | } 168 | 169 | private func render(state: State) { 170 | switch state.networkState { 171 | case .nothing: 172 | activityIndicator.stopAnimating() 173 | case .requesting: 174 | activityIndicator.startAnimating() 175 | case let .error(error): 176 | let alertController = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert) 177 | alertController.addAction(UIAlertAction(title: "Close", style: .default, handler: nil)) 178 | present(alertController, animated: true, completion: nil) 179 | } 180 | 181 | models = state.models 182 | tableView.reloadData() 183 | } 184 | 185 | // MARK: - UITableViewDataSource 186 | 187 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 188 | return models.count 189 | } 190 | 191 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 192 | let model = models[indexPath.row] 193 | let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: String(describing: UITableViewCell.self), for: indexPath) 194 | cell.textLabel?.text = model.name 195 | return cell 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /RxFluxExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 5B52675D1EC37151004DA842 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C896D9611EBC995A00AE75BD /* RxCocoa.framework */; }; 11 | 5B52675E1EC37151004DA842 /* RxCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C896D9611EBC995A00AE75BD /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 12 | 5BC65D681EC1ADB00088D5B0 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BC65D671EC1ADB00088D5B0 /* Default-568h@2x.png */; }; 13 | C8109A1C1EBCEDE800F36E36 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8109A1B1EBCEDE800F36E36 /* Model.swift */; }; 14 | C896D9481EBC89A900AE75BD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C896D9471EBC89A900AE75BD /* AppDelegate.swift */; }; 15 | C896D9581EBC89FA00AE75BD /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C896D9571EBC89FA00AE75BD /* RxSwift.framework */; }; 16 | C896D9591EBC89FA00AE75BD /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C896D9571EBC89FA00AE75BD /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | C896D95D1EBC8B1200AE75BD /* ModelTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C896D95C1EBC8B1200AE75BD /* ModelTableViewController.swift */; }; 18 | C896D95F1EBC8C2F00AE75BD /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = C896D95E1EBC8C2F00AE75BD /* APIClient.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXCopyFilesBuildPhase section */ 22 | C896D95A1EBC89FA00AE75BD /* Embed Frameworks */ = { 23 | isa = PBXCopyFilesBuildPhase; 24 | buildActionMask = 2147483647; 25 | dstPath = ""; 26 | dstSubfolderSpec = 10; 27 | files = ( 28 | 5B52675E1EC37151004DA842 /* RxCocoa.framework in Embed Frameworks */, 29 | C896D9591EBC89FA00AE75BD /* RxSwift.framework in Embed Frameworks */, 30 | ); 31 | name = "Embed Frameworks"; 32 | runOnlyForDeploymentPostprocessing = 0; 33 | }; 34 | /* End PBXCopyFilesBuildPhase section */ 35 | 36 | /* Begin PBXFileReference section */ 37 | 5BC65D671EC1ADB00088D5B0 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = ""; }; 38 | C8109A1B1EBCEDE800F36E36 /* Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; 39 | C896D9421EBC89A900AE75BD /* RxFluxExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RxFluxExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | C896D9471EBC89A900AE75BD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 41 | C896D9511EBC89A900AE75BD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 42 | C896D9571EBC89FA00AE75BD /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = ""; }; 43 | C896D95C1EBC8B1200AE75BD /* ModelTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModelTableViewController.swift; sourceTree = ""; }; 44 | C896D95E1EBC8C2F00AE75BD /* APIClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; }; 45 | C896D9611EBC995A00AE75BD /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/iOS/RxCocoa.framework; sourceTree = ""; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | C896D93F1EBC89A900AE75BD /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | 5B52675D1EC37151004DA842 /* RxCocoa.framework in Frameworks */, 54 | C896D9581EBC89FA00AE75BD /* RxSwift.framework in Frameworks */, 55 | ); 56 | runOnlyForDeploymentPostprocessing = 0; 57 | }; 58 | /* End PBXFrameworksBuildPhase section */ 59 | 60 | /* Begin PBXGroup section */ 61 | C8109A181EBCE6C900F36E36 /* Frameworks */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | C896D9611EBC995A00AE75BD /* RxCocoa.framework */, 65 | C896D9571EBC89FA00AE75BD /* RxSwift.framework */, 66 | ); 67 | name = Frameworks; 68 | sourceTree = ""; 69 | }; 70 | C896D9391EBC89A800AE75BD = { 71 | isa = PBXGroup; 72 | children = ( 73 | C896D9441EBC89A900AE75BD /* RxFluxExample */, 74 | C8109A181EBCE6C900F36E36 /* Frameworks */, 75 | C896D9431EBC89A900AE75BD /* Products */, 76 | ); 77 | sourceTree = ""; 78 | }; 79 | C896D9431EBC89A900AE75BD /* Products */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | C896D9421EBC89A900AE75BD /* RxFluxExample.app */, 83 | ); 84 | name = Products; 85 | sourceTree = ""; 86 | }; 87 | C896D9441EBC89A900AE75BD /* RxFluxExample */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | C896D9471EBC89A900AE75BD /* AppDelegate.swift */, 91 | C8109A1B1EBCEDE800F36E36 /* Model.swift */, 92 | C896D95E1EBC8C2F00AE75BD /* APIClient.swift */, 93 | C896D95C1EBC8B1200AE75BD /* ModelTableViewController.swift */, 94 | C896D9511EBC89A900AE75BD /* Info.plist */, 95 | 5BC65D671EC1ADB00088D5B0 /* Default-568h@2x.png */, 96 | ); 97 | path = RxFluxExample; 98 | sourceTree = ""; 99 | }; 100 | /* End PBXGroup section */ 101 | 102 | /* Begin PBXNativeTarget section */ 103 | C896D9411EBC89A900AE75BD /* RxFluxExample */ = { 104 | isa = PBXNativeTarget; 105 | buildConfigurationList = C896D9541EBC89A900AE75BD /* Build configuration list for PBXNativeTarget "RxFluxExample" */; 106 | buildPhases = ( 107 | C896D93E1EBC89A900AE75BD /* Sources */, 108 | C896D93F1EBC89A900AE75BD /* Frameworks */, 109 | C896D9401EBC89A900AE75BD /* Resources */, 110 | C896D95A1EBC89FA00AE75BD /* Embed Frameworks */, 111 | C896D95B1EBC89FF00AE75BD /* ShellScript */, 112 | ); 113 | buildRules = ( 114 | ); 115 | dependencies = ( 116 | ); 117 | name = RxFluxExample; 118 | productName = RxFluxExample; 119 | productReference = C896D9421EBC89A900AE75BD /* RxFluxExample.app */; 120 | productType = "com.apple.product-type.application"; 121 | }; 122 | /* End PBXNativeTarget section */ 123 | 124 | /* Begin PBXProject section */ 125 | C896D93A1EBC89A800AE75BD /* Project object */ = { 126 | isa = PBXProject; 127 | attributes = { 128 | LastSwiftUpdateCheck = 0830; 129 | LastUpgradeCheck = 0830; 130 | ORGANIZATIONNAME = morishin; 131 | TargetAttributes = { 132 | C896D9411EBC89A900AE75BD = { 133 | CreatedOnToolsVersion = 8.3; 134 | LastSwiftMigration = 0830; 135 | ProvisioningStyle = Automatic; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = C896D93D1EBC89A800AE75BD /* Build configuration list for PBXProject "RxFluxExample" */; 140 | compatibilityVersion = "Xcode 3.2"; 141 | developmentRegion = English; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = C896D9391EBC89A800AE75BD; 148 | productRefGroup = C896D9431EBC89A900AE75BD /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | C896D9411EBC89A900AE75BD /* RxFluxExample */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | C896D9401EBC89A900AE75BD /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 5BC65D681EC1ADB00088D5B0 /* Default-568h@2x.png in Resources */, 163 | ); 164 | runOnlyForDeploymentPostprocessing = 0; 165 | }; 166 | /* End PBXResourcesBuildPhase section */ 167 | 168 | /* Begin PBXShellScriptBuildPhase section */ 169 | C896D95B1EBC89FF00AE75BD /* ShellScript */ = { 170 | isa = PBXShellScriptBuildPhase; 171 | buildActionMask = 2147483647; 172 | files = ( 173 | ); 174 | inputPaths = ( 175 | "$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework", 176 | "$(SRCROOT)/Carthage/Build/iOS/RxCocoa.framework", 177 | ); 178 | outputPaths = ( 179 | ); 180 | runOnlyForDeploymentPostprocessing = 0; 181 | shellPath = /bin/sh; 182 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 183 | }; 184 | /* End PBXShellScriptBuildPhase section */ 185 | 186 | /* Begin PBXSourcesBuildPhase section */ 187 | C896D93E1EBC89A900AE75BD /* Sources */ = { 188 | isa = PBXSourcesBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | C896D9481EBC89A900AE75BD /* AppDelegate.swift in Sources */, 192 | C896D95D1EBC8B1200AE75BD /* ModelTableViewController.swift in Sources */, 193 | C896D95F1EBC8C2F00AE75BD /* APIClient.swift in Sources */, 194 | C8109A1C1EBCEDE800F36E36 /* Model.swift in Sources */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | /* End PBXSourcesBuildPhase section */ 199 | 200 | /* Begin XCBuildConfiguration section */ 201 | C896D9521EBC89A900AE75BD /* Debug */ = { 202 | isa = XCBuildConfiguration; 203 | buildSettings = { 204 | ALWAYS_SEARCH_USER_PATHS = NO; 205 | CLANG_ANALYZER_NONNULL = YES; 206 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 207 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 208 | CLANG_CXX_LIBRARY = "libc++"; 209 | CLANG_ENABLE_MODULES = YES; 210 | CLANG_ENABLE_OBJC_ARC = YES; 211 | CLANG_WARN_BOOL_CONVERSION = YES; 212 | CLANG_WARN_CONSTANT_CONVERSION = YES; 213 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 214 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 215 | CLANG_WARN_EMPTY_BODY = YES; 216 | CLANG_WARN_ENUM_CONVERSION = YES; 217 | CLANG_WARN_INFINITE_RECURSION = YES; 218 | CLANG_WARN_INT_CONVERSION = YES; 219 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 220 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 221 | CLANG_WARN_UNREACHABLE_CODE = YES; 222 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 223 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 224 | COPY_PHASE_STRIP = NO; 225 | DEBUG_INFORMATION_FORMAT = dwarf; 226 | ENABLE_STRICT_OBJC_MSGSEND = YES; 227 | ENABLE_TESTABILITY = YES; 228 | GCC_C_LANGUAGE_STANDARD = gnu99; 229 | GCC_DYNAMIC_NO_PIC = NO; 230 | GCC_NO_COMMON_BLOCKS = YES; 231 | GCC_OPTIMIZATION_LEVEL = 0; 232 | GCC_PREPROCESSOR_DEFINITIONS = ( 233 | "DEBUG=1", 234 | "$(inherited)", 235 | ); 236 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 237 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 238 | GCC_WARN_UNDECLARED_SELECTOR = YES; 239 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 240 | GCC_WARN_UNUSED_FUNCTION = YES; 241 | GCC_WARN_UNUSED_VARIABLE = YES; 242 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 243 | MTL_ENABLE_DEBUG_INFO = YES; 244 | ONLY_ACTIVE_ARCH = YES; 245 | OTHER_LDFLAGS = "-ObjC"; 246 | SDKROOT = iphoneos; 247 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 248 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 249 | TARGETED_DEVICE_FAMILY = "1,2"; 250 | }; 251 | name = Debug; 252 | }; 253 | C896D9531EBC89A900AE75BD /* Release */ = { 254 | isa = XCBuildConfiguration; 255 | buildSettings = { 256 | ALWAYS_SEARCH_USER_PATHS = NO; 257 | CLANG_ANALYZER_NONNULL = YES; 258 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 259 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 260 | CLANG_CXX_LIBRARY = "libc++"; 261 | CLANG_ENABLE_MODULES = YES; 262 | CLANG_ENABLE_OBJC_ARC = YES; 263 | CLANG_WARN_BOOL_CONVERSION = YES; 264 | CLANG_WARN_CONSTANT_CONVERSION = YES; 265 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 266 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 267 | CLANG_WARN_EMPTY_BODY = YES; 268 | CLANG_WARN_ENUM_CONVERSION = YES; 269 | CLANG_WARN_INFINITE_RECURSION = YES; 270 | CLANG_WARN_INT_CONVERSION = YES; 271 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 272 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 273 | CLANG_WARN_UNREACHABLE_CODE = YES; 274 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 275 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 276 | COPY_PHASE_STRIP = NO; 277 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 278 | ENABLE_NS_ASSERTIONS = NO; 279 | ENABLE_STRICT_OBJC_MSGSEND = YES; 280 | GCC_C_LANGUAGE_STANDARD = gnu99; 281 | GCC_NO_COMMON_BLOCKS = YES; 282 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 283 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 284 | GCC_WARN_UNDECLARED_SELECTOR = YES; 285 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 286 | GCC_WARN_UNUSED_FUNCTION = YES; 287 | GCC_WARN_UNUSED_VARIABLE = YES; 288 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 289 | MTL_ENABLE_DEBUG_INFO = NO; 290 | OTHER_LDFLAGS = "-ObjC"; 291 | SDKROOT = iphoneos; 292 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 293 | TARGETED_DEVICE_FAMILY = "1,2"; 294 | VALIDATE_PRODUCT = YES; 295 | }; 296 | name = Release; 297 | }; 298 | C896D9551EBC89A900AE75BD /* Debug */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | CLANG_ENABLE_MODULES = YES; 302 | DEVELOPMENT_TEAM = ""; 303 | FRAMEWORK_SEARCH_PATHS = ( 304 | "$(inherited)", 305 | "$(PROJECT_DIR)/Carthage/Build/iOS", 306 | ); 307 | INFOPLIST_FILE = RxFluxExample/Info.plist; 308 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 309 | PRODUCT_BUNDLE_IDENTIFIER = me.morishin.RxFluxExample; 310 | PRODUCT_NAME = "$(TARGET_NAME)"; 311 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 312 | SWIFT_VERSION = 3.0; 313 | }; 314 | name = Debug; 315 | }; 316 | C896D9561EBC89A900AE75BD /* Release */ = { 317 | isa = XCBuildConfiguration; 318 | buildSettings = { 319 | CLANG_ENABLE_MODULES = YES; 320 | DEVELOPMENT_TEAM = ""; 321 | FRAMEWORK_SEARCH_PATHS = ( 322 | "$(inherited)", 323 | "$(PROJECT_DIR)/Carthage/Build/iOS", 324 | ); 325 | INFOPLIST_FILE = RxFluxExample/Info.plist; 326 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 327 | PRODUCT_BUNDLE_IDENTIFIER = me.morishin.RxFluxExample; 328 | PRODUCT_NAME = "$(TARGET_NAME)"; 329 | SWIFT_VERSION = 3.0; 330 | }; 331 | name = Release; 332 | }; 333 | /* End XCBuildConfiguration section */ 334 | 335 | /* Begin XCConfigurationList section */ 336 | C896D93D1EBC89A800AE75BD /* Build configuration list for PBXProject "RxFluxExample" */ = { 337 | isa = XCConfigurationList; 338 | buildConfigurations = ( 339 | C896D9521EBC89A900AE75BD /* Debug */, 340 | C896D9531EBC89A900AE75BD /* Release */, 341 | ); 342 | defaultConfigurationIsVisible = 0; 343 | defaultConfigurationName = Release; 344 | }; 345 | C896D9541EBC89A900AE75BD /* Build configuration list for PBXNativeTarget "RxFluxExample" */ = { 346 | isa = XCConfigurationList; 347 | buildConfigurations = ( 348 | C896D9551EBC89A900AE75BD /* Debug */, 349 | C896D9561EBC89A900AE75BD /* Release */, 350 | ); 351 | defaultConfigurationIsVisible = 0; 352 | defaultConfigurationName = Release; 353 | }; 354 | /* End XCConfigurationList section */ 355 | }; 356 | rootObject = C896D93A1EBC89A800AE75BD /* Project object */; 357 | } 358 | --------------------------------------------------------------------------------