├── 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 |
--------------------------------------------------------------------------------