Skip to content

Commit 2eccd35

Browse files
authored
Merge pull request #28 from reloni/develop
Caching
2 parents 67f712f + 88ca311 commit 2eccd35

24 files changed

+640
-133
lines changed

.travis.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
language: objective-c
2-
osx_image: xcode8
2+
osx_image: xcode8.1
33
xcode_project: RxHttpClient.xcodeproj
44

55
env:
66
global:
77
#- WORKSPACE=
88
- PROJECT=RxHttpClient.xcodeproj
99
- FRAMEWORK_SCHEME=RxHttpClient
10-
- SDK=iphonesimulator10.0
11-
- DESTINATION_PLATFORM='platform=iOS Simulator,name=iPhone 6s,OS=10.0'
10+
- SDK=iphonesimulator10.1
11+
- DESTINATION_PLATFORM='platform=iOS Simulator,name=iPhone 6s,OS=10.1'
1212

1313
before_install:
14-
- SIMULATOR_ID=$(xcrun instruments -s | grep -o "iPhone 6s (10.0) \[.*\]" | grep -o "\[.*\]" | sed "s/^\[\(.*\)\]$/\1/")
14+
# - SIMULATOR_ID=$(xcrun instruments -s | grep -o "iPhone 6s (10.1) \[.*\]" | grep -o "\[.*\]" | sed "s/^\[\(.*\)\]$/\1/")
1515

1616
before_script:
1717
- carthage version
@@ -28,7 +28,7 @@ before_script:
2828
- cp -R -f ./Build/Release-iphonesimulator/ ./Carthage/Build/iOS
2929

3030
script:
31-
- open -a "simulator" --args -CurrentDeviceUDID $SIMULATOR_ID
31+
#- open -a "simulator" --args -CurrentDeviceUDID $SIMULATOR_ID
3232
#- set -o pipefail && xcodebuild -scheme "$FRAMEWORK_SCHEME" -project "$PROJECT" -sdk "$SDK" -configuration Debug ONLY_ACTIVE_ARCH=YES -destination "$DESTINATION_PLATFORM" GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES clean build | xcpretty -c
3333
- set -o pipefail && xcodebuild -scheme "$FRAMEWORK_SCHEME" -project "$PROJECT" -sdk "$SDK" -configuration Debug ONLY_ACTIVE_ARCH=YES -destination "$DESTINATION_PLATFORM" -enableCodeCoverage YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES clean test | xcpretty -c
3434

Cartfile.resolved

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
github "AliSoftware/OHHTTPStubs" "45a2ceaebaef5ae434ffd3e2a5aef4c5ce3fa91b"
1+
github "AliSoftware/OHHTTPStubs" "57feceaabf333e72b2c637dfba6c13a7a5c49619"
22
github "ReactiveX/RxSwift" "3.0.1"

Readme.md

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ RxHttpClient
88
RxHttpClient is a "reactive wrapper" around NSURLSession. Under the hood it implements session delegates (like NSURLSessionDelegate or NSURLSessionTaskDelegate) and translates session events into Observables using [RxSwift](https://github.com/ReactiveX/RxSwift). Main purpose of this framework is to make "streaming" data as simple as possible and provide convenient features for caching data.
99

1010
##Requirements
11-
- Xcode 8.0
12-
- Swift 3.0
11+
- Xcode 8.1
12+
- Swift 3.0.1
1313

1414
##Installation
1515
Now only [Carthage](https://github.com/Carthage/Carthage) supported:
@@ -48,12 +48,12 @@ If dealing with every chunk of data is not necessary it's possible to pass an in
4848
let client = HttpClient()
4949
let bag = DisposeBag()
5050
let url = URL(string: "url_to_resource")!
51-
client.request(url: url, cacheProvider: MemoryCacheProvider()).subscribe(onNext: { event in
52-
guard case StreamTaskEvents.success(let cacheProvider) = event else { return }
51+
client.request(url: url, dataCacheProvider: MemoryCacheProvider()).subscribe(onNext: { event in
52+
guard case StreamTaskEvents.success(let dataCacheProvider) = event else { return }
5353
54-
if let cacheProvider = cacheProvider {
54+
if let dataCacheProvider = dataCacheProvider {
5555
// getting cached data from provider
56-
let downloadedData = cacheProvider.getData()
56+
let downloadedData = dataCacheProvider.getData()
5757
}
5858
}).addDisposableTo(bag)
5959
```
@@ -88,6 +88,28 @@ client.requestJson(url: url).subscribe(onNext: { json in /* do something with re
8888
}).addDisposableTo(bag)
8989
```
9090

91+
####Response caching
92+
HttpClient can cache latest response for GET request. To use caching, HttpClient should be initialized with instance of UrlRequestCacheProviderType:
93+
94+
```
95+
// directory where cache data will be saved
96+
let cacheDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("Cache")
97+
// instance of UrlRequestFileSystemCacheProvider that will store cached data in specified directory
98+
let urlCacheProvider = UrlRequestFileSystemCacheProvider(cacheDirectory: cacheDirectory)
99+
let client = HttpClient(urlRequestCacheProvider: urlCacheProvider)
100+
101+
// Use specific cache mode for request
102+
// If data for URL already cached, this data will be returned immediately and after that request to the server will be invoked
103+
client.requestJson(url: url, requestCacheMode: CacheMode(cacheResponse: true, returnCachedResponse: true, invokeRequest: true)).subscribe( /* */).addDisposableTo(bag)
104+
105+
// If returnCachedResponse is false, cached data will not be returned even if exists
106+
client.requestJson(url: url, requestCacheMode: CacheMode(cacheResponse: true, returnCachedResponse: false, invokeRequest: true)).subscribe( /* */).addDisposableTo(bag)
107+
108+
// use predefined mode
109+
// "offline mode", use only cache and don't invoke request to server
110+
client.requestJson(url: url, requestCacheMode: .cacheOnly).subscribe( /* */).addDisposableTo(bag)
111+
```
112+
91113
####StreamDataTask
92114
StreamDataTask is a more "low level" object that wraps NSURLSessionDataTask. In most situations is't more convenient to use loadStreamData method (it actually simply forwards events from StreamDataTask), but if necessary StreamDataTask may be used in this way:
93115
```
@@ -112,6 +134,16 @@ task.taskProgress.subscribe(onNext: { event in
112134
task.resume()
113135
```
114136

137+
####MIME type conversion
138+
This framework also contains useful methods to convert, for example, MIME type to file extension, or UTI type to MIME type:
139+
```
140+
let extension = MimeTypeConverter.utiToFileExtension("public.mp3") // returns "mp3"
141+
let uti = MimeTypeConverter.mimeToUti("audio/mpeg") // returns "public.mp3"
142+
143+
// it also works with strings
144+
let mime = "public.mp3".asUtiType.mimeType // returns "audio/mpeg"
145+
```
146+
115147
##How it works
116148
HttpClient object holds it's own NSURLSession. It creates session by providing a session delegate object for handling session-related events. So StreamTaskEvents enum actually represents this session events, for example `case receiveResponse(URLResponse)` means that `URLSession(_:dataTask:didReceiveResponse:completionHandler:)` delegate method was invoked.
117149
Because NSURLSession holds strong reference to delegate it should be invalidated, HttpClient do that in deinitializer by invoking finishTasksAndInvalidate() method, so session will allow running tasks to finish work.

RxHttpClient.xcodeproj/project.pbxproj

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,24 @@
1010
6E1329B51D47769500BE6270 /* HttpClientBasicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E5B3CE71D2D1F7400775D9F /* HttpClientBasicTests.swift */; };
1111
6E1329B71D478B7600BE6270 /* MemoryCacheProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EFB9EEA1D2A57B600E30A5D /* MemoryCacheProviderTests.swift */; };
1212
6E1329B81D47903E00BE6270 /* NSURLSessionTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E5B3CEB1D2D32F900775D9F /* NSURLSessionTypeTests.swift */; };
13+
6E190F881DECC316002BA10F /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E190F851DECC316002BA10F /* Data+Extensions.swift */; };
14+
6E190F891DECC316002BA10F /* HttpRequestCacheProviderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E190F861DECC316002BA10F /* HttpRequestCacheProviderType.swift */; };
15+
6E190F8A1DECC316002BA10F /* RxHttpClient-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E190F871DECC316002BA10F /* RxHttpClient-Bridging-Header.h */; };
16+
6E190F8D1DECC320002BA10F /* HttpClientCachingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E190F8B1DECC320002BA10F /* HttpClientCachingTests.swift */; };
17+
6E190F8E1DECC320002BA10F /* HttpRequestFileSystemCacheProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E190F8C1DECC320002BA10F /* HttpRequestFileSystemCacheProviderTests.swift */; };
1318
6E1C07C21D48FF92009513FD /* HttpClientType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E1C07C11D48FF92009513FD /* HttpClientType+Extensions.swift */; };
19+
6E2690311DEB49BC00EA5CCE /* (null) in Sources */ = {isa = PBXBuildFile; };
20+
6E42A8C01DEA26FE003687E3 /* (null) in Sources */ = {isa = PBXBuildFile; };
21+
6E42A8C41DEA2EA8003687E3 /* (null) in Sources */ = {isa = PBXBuildFile; };
22+
6E4823B11DECAF1900F1A8DC /* (null) in Sources */ = {isa = PBXBuildFile; };
23+
6E4823B41DECBD1B00F1A8DC /* MimeType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4823B31DECBD1B00F1A8DC /* MimeType+Extensions.swift */; };
1424
6E556B591D57447A00E43388 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E556B581D57447A00E43388 /* RxSwift.framework */; };
1525
6E5B3CEE1D2D3C8400775D9F /* NSURLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E5B3CED1D2D3C8400775D9F /* NSURLTests.swift */; };
1626
6E5B3CF01D2D43C000775D9F /* MimeTypeConverterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E5B3CEF1D2D43C000775D9F /* MimeTypeConverterTests.swift */; };
1727
6E81B0381D4A850100D099F1 /* HttpClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E81B0371D4A850100D099F1 /* HttpClient.swift */; };
1828
6E81B03A1D4A85CF00D099F1 /* MemoryCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E81B0391D4A85CF00D099F1 /* MemoryCacheProvider.swift */; };
1929
6E9360EF1D2AABE100F80F76 /* RxHttpClient.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6EFB9EB81D2A4E2600E30A5D /* RxHttpClient.framework */; };
30+
6EADD70B1DEB4528006DE223 /* Data+ExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EADD70A1DEB4528006DE223 /* Data+ExtensionsTests.swift */; };
2031
6ED185511DC7AE1C0071BD4D /* URLRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ED185501DC7AE1C0071BD4D /* URLRequestTests.swift */; };
2132
6EF8CA431D5664520095A634 /* StreamDataTaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EFB9EEB1D2A57B600E30A5D /* StreamDataTaskTests.swift */; };
2233
6EFB9EE61D2A563000E30A5D /* MimeTypeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EFB9EE51D2A563000E30A5D /* MimeTypeConverter.swift */; };
@@ -40,14 +51,21 @@
4051
/* End PBXContainerItemProxy section */
4152

4253
/* Begin PBXFileReference section */
54+
6E190F851DECC316002BA10F /* Data+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = "<group>"; };
55+
6E190F861DECC316002BA10F /* HttpRequestCacheProviderType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpRequestCacheProviderType.swift; sourceTree = "<group>"; };
56+
6E190F871DECC316002BA10F /* RxHttpClient-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RxHttpClient-Bridging-Header.h"; sourceTree = "<group>"; };
57+
6E190F8B1DECC320002BA10F /* HttpClientCachingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpClientCachingTests.swift; sourceTree = "<group>"; };
58+
6E190F8C1DECC320002BA10F /* HttpRequestFileSystemCacheProviderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpRequestFileSystemCacheProviderTests.swift; sourceTree = "<group>"; };
4359
6E1C07C11D48FF92009513FD /* HttpClientType+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HttpClientType+Extensions.swift"; sourceTree = "<group>"; };
60+
6E4823B31DECBD1B00F1A8DC /* MimeType+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MimeType+Extensions.swift"; sourceTree = "<group>"; };
4461
6E556B581D57447A00E43388 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = "<group>"; };
4562
6E5B3CE71D2D1F7400775D9F /* HttpClientBasicTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = HttpClientBasicTests.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
4663
6E5B3CEB1D2D32F900775D9F /* NSURLSessionTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = NSURLSessionTypeTests.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
4764
6E5B3CED1D2D3C8400775D9F /* NSURLTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSURLTests.swift; sourceTree = "<group>"; };
4865
6E5B3CEF1D2D43C000775D9F /* MimeTypeConverterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MimeTypeConverterTests.swift; sourceTree = "<group>"; };
4966
6E81B0371D4A850100D099F1 /* HttpClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpClient.swift; sourceTree = "<group>"; };
5067
6E81B0391D4A85CF00D099F1 /* MemoryCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryCacheProvider.swift; sourceTree = "<group>"; };
68+
6EADD70A1DEB4528006DE223 /* Data+ExtensionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+ExtensionsTests.swift"; sourceTree = "<group>"; };
5169
6ED185501DC7AE1C0071BD4D /* URLRequestTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLRequestTests.swift; sourceTree = "<group>"; };
5270
6EFB9EB81D2A4E2600E30A5D /* RxHttpClient.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxHttpClient.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5371
6EFB9EBD1D2A4E2600E30A5D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -107,6 +125,9 @@
107125
6EFB9EBA1D2A4E2600E30A5D /* RxHttpClient */ = {
108126
isa = PBXGroup;
109127
children = (
128+
6E190F851DECC316002BA10F /* Data+Extensions.swift */,
129+
6E190F861DECC316002BA10F /* HttpRequestCacheProviderType.swift */,
130+
6E190F871DECC316002BA10F /* RxHttpClient-Bridging-Header.h */,
110131
6EFE01CD1D5A5E1E007CE72A /* HttpClientError.swift */,
111132
6EFB9ED31D2A53FD00E30A5D /* HttpClientType.swift */,
112133
6E1C07C11D48FF92009513FD /* HttpClientType+Extensions.swift */,
@@ -117,6 +138,7 @@
117138
6EFB9ED41D2A53FD00E30A5D /* HttpExtensions.swift */,
118139
6EFB9ED71D2A53FD00E30A5D /* NSURLSessionDataEventsObserver.swift */,
119140
6EFB9EE51D2A563000E30A5D /* MimeTypeConverter.swift */,
141+
6E4823B31DECBD1B00F1A8DC /* MimeType+Extensions.swift */,
120142
6EFB9EBD1D2A4E2600E30A5D /* Info.plist */,
121143
);
122144
path = RxHttpClient;
@@ -125,15 +147,18 @@
125147
6EFB9EC61D2A4E2600E30A5D /* RxHttpClientTests */ = {
126148
isa = PBXGroup;
127149
children = (
128-
6EFB9EC91D2A4E2600E30A5D /* Info.plist */,
129150
6EFB9EF01D2A587100E30A5D /* Fake.swift */,
151+
6E5B3CE71D2D1F7400775D9F /* HttpClientBasicTests.swift */,
152+
6E190F8B1DECC320002BA10F /* HttpClientCachingTests.swift */,
153+
6E190F8C1DECC320002BA10F /* HttpRequestFileSystemCacheProviderTests.swift */,
130154
6EFB9EEA1D2A57B600E30A5D /* MemoryCacheProviderTests.swift */,
131155
6EFB9EEB1D2A57B600E30A5D /* StreamDataTaskTests.swift */,
132-
6E5B3CE71D2D1F7400775D9F /* HttpClientBasicTests.swift */,
133156
6E5B3CEB1D2D32F900775D9F /* NSURLSessionTypeTests.swift */,
134157
6E5B3CED1D2D3C8400775D9F /* NSURLTests.swift */,
135158
6E5B3CEF1D2D43C000775D9F /* MimeTypeConverterTests.swift */,
136159
6ED185501DC7AE1C0071BD4D /* URLRequestTests.swift */,
160+
6EADD70A1DEB4528006DE223 /* Data+ExtensionsTests.swift */,
161+
6EFB9EC91D2A4E2600E30A5D /* Info.plist */,
137162
);
138163
path = RxHttpClientTests;
139164
sourceTree = "<group>";
@@ -145,6 +170,7 @@
145170
isa = PBXHeadersBuildPhase;
146171
buildActionMask = 2147483647;
147172
files = (
173+
6E190F8A1DECC316002BA10F /* RxHttpClient-Bridging-Header.h in Headers */,
148174
);
149175
runOnlyForDeploymentPostprocessing = 0;
150176
};
@@ -266,13 +292,18 @@
266292
isa = PBXSourcesBuildPhase;
267293
buildActionMask = 2147483647;
268294
files = (
295+
6E42A8C01DEA26FE003687E3 /* (null) in Sources */,
296+
6E190F881DECC316002BA10F /* Data+Extensions.swift in Sources */,
269297
6EFB9EF91D2A5BC300E30A5D /* StreamDataTask.swift in Sources */,
270298
6EFB9EE61D2A563000E30A5D /* MimeTypeConverter.swift in Sources */,
271299
6E81B0381D4A850100D099F1 /* HttpClient.swift in Sources */,
300+
6E190F891DECC316002BA10F /* HttpRequestCacheProviderType.swift in Sources */,
272301
6EFE01CE1D5A5E1E007CE72A /* HttpClientError.swift in Sources */,
273302
6EFB9EF41D2A5BBF00E30A5D /* CacheProviderType.swift in Sources */,
303+
6E42A8C41DEA2EA8003687E3 /* (null) in Sources */,
274304
6EFB9EF51D2A5BC300E30A5D /* HttpClientType.swift in Sources */,
275305
6E81B03A1D4A85CF00D099F1 /* MemoryCacheProvider.swift in Sources */,
306+
6E4823B41DECBD1B00F1A8DC /* MimeType+Extensions.swift in Sources */,
276307
6E1C07C21D48FF92009513FD /* HttpClientType+Extensions.swift in Sources */,
277308
6EFB9EF61D2A5BC300E30A5D /* HttpExtensions.swift in Sources */,
278309
6EFB9EF81D2A5BC300E30A5D /* NSURLSessionDataEventsObserver.swift in Sources */,
@@ -284,11 +315,16 @@
284315
buildActionMask = 2147483647;
285316
files = (
286317
6EF8CA431D5664520095A634 /* StreamDataTaskTests.swift in Sources */,
318+
6EADD70B1DEB4528006DE223 /* Data+ExtensionsTests.swift in Sources */,
319+
6E4823B11DECAF1900F1A8DC /* (null) in Sources */,
287320
6E5B3CEE1D2D3C8400775D9F /* NSURLTests.swift in Sources */,
288321
6E1329B51D47769500BE6270 /* HttpClientBasicTests.swift in Sources */,
322+
6E2690311DEB49BC00EA5CCE /* (null) in Sources */,
323+
6E190F8D1DECC320002BA10F /* HttpClientCachingTests.swift in Sources */,
289324
6E1329B71D478B7600BE6270 /* MemoryCacheProviderTests.swift in Sources */,
290325
6E1329B81D47903E00BE6270 /* NSURLSessionTypeTests.swift in Sources */,
291326
6E5B3CF01D2D43C000775D9F /* MimeTypeConverterTests.swift in Sources */,
327+
6E190F8E1DECC320002BA10F /* HttpRequestFileSystemCacheProviderTests.swift in Sources */,
292328
6EFB9EFE1D2A5C8E00E30A5D /* Fake.swift in Sources */,
293329
6ED185511DC7AE1C0071BD4D /* URLRequestTests.swift in Sources */,
294330
);
@@ -420,6 +456,7 @@
420456
PRODUCT_BUNDLE_IDENTIFIER = com.AntonEfimenko.RxHttpClient;
421457
PRODUCT_NAME = "$(TARGET_NAME)";
422458
SKIP_INSTALL = YES;
459+
SWIFT_OBJC_BRIDGING_HEADER = "RxHttpClient/RxHttpClient-Bridging-Header.h";
423460
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
424461
SWIFT_VERSION = 3.0;
425462
};
@@ -444,6 +481,7 @@
444481
PRODUCT_BUNDLE_IDENTIFIER = com.AntonEfimenko.RxHttpClient;
445482
PRODUCT_NAME = "$(TARGET_NAME)";
446483
SKIP_INSTALL = YES;
484+
SWIFT_OBJC_BRIDGING_HEADER = "RxHttpClient/RxHttpClient-Bridging-Header.h";
447485
SWIFT_VERSION = 3.0;
448486
};
449487
name = Release;
@@ -460,9 +498,8 @@
460498
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
461499
PRODUCT_BUNDLE_IDENTIFIER = com.AntonEfimenko.RxHttpClientTests;
462500
PRODUCT_NAME = "$(TARGET_NAME)";
463-
SWIFT_OBJC_BRIDGING_HEADER = "";
464501
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
465-
SWIFT_VERSION = 3.0;
502+
SWIFT_VERSION = 3.0.1;
466503
};
467504
name = Debug;
468505
};
@@ -478,8 +515,7 @@
478515
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
479516
PRODUCT_BUNDLE_IDENTIFIER = com.AntonEfimenko.RxHttpClientTests;
480517
PRODUCT_NAME = "$(TARGET_NAME)";
481-
SWIFT_OBJC_BRIDGING_HEADER = "";
482-
SWIFT_VERSION = 3.0;
518+
SWIFT_VERSION = 3.0.1;
483519
};
484520
name = Release;
485521
};

0 commit comments

Comments
 (0)