Skip to content
This repository was archived by the owner on Feb 2, 2022. It is now read-only.

Commit 0a997c4

Browse files
authored
Merge pull request #53 from nodes-ios/Codable+URLSession-extention
added URLSession+Codable extension
2 parents 38e6961 + 907d177 commit 0a997c4

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

Codemine.xcodeproj/project.pbxproj

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@
6363
293490EE1C6CAFD500E8305E /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490ED1C6CAFD500E8305E /* Application.swift */; };
6464
293490F01C6CAFF200E8305E /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490EF1C6CAFF200E8305E /* Then.swift */; };
6565
296831491DD5EC670002FE5A /* DispatchTime+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */; };
66+
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
67+
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
68+
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
69+
42FB12162063D04900F850D1 /* URLSession+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42FB12122063D04900F850D1 /* URLSession+Codable.swift */; };
6670
838A0F971F03F57E00469143 /* String+HTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838A0F961F03F57E00469143 /* String+HTML.swift */; };
6771
83A5BEBC1D981F3500C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; };
6872
83A5BEBD1D98215F00C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; };
@@ -76,8 +80,8 @@
7680
83A5BEC91D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
7781
83A5BECA1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
7882
83A5BECB1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; };
79-
9F4A1BBE1F97AF0F00154997 /* XCTestCase+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */; };
8083
8C9AAA2F1F4ED1F000F9E7C9 /* URLParameterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9AAA2E1F4ED1F000F9E7C9 /* URLParameterTests.swift */; };
84+
9F4A1BBE1F97AF0F00154997 /* XCTestCase+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */; };
8185
/* End PBXBuildFile section */
8286

8387
/* Begin PBXContainerItemProxy section */
@@ -131,13 +135,14 @@
131135
293490ED1C6CAFD500E8305E /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; };
132136
293490EF1C6CAFF200E8305E /* Then.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = "<group>"; };
133137
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DispatchTime+Utilities.swift"; sourceTree = "<group>"; };
138+
42FB12122063D04900F850D1 /* URLSession+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSession+Codable.swift"; sourceTree = "<group>"; };
134139
838A0F961F03F57E00469143 /* String+HTML.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+HTML.swift"; sourceTree = "<group>"; };
135140
83A5BEBB1D981F3500C74312 /* UIImageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageTests.swift; sourceTree = "<group>"; };
136141
83A5BEBF1D98226800C74312 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = "<group>"; };
137142
83A5BEC31D98228300C74312 /* alert.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = alert.png; sourceTree = "<group>"; };
138143
83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLImageAssetSizeTests.swift; sourceTree = "<group>"; };
139-
9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Utilities.swift"; sourceTree = "<group>"; };
140144
8C9AAA2E1F4ED1F000F9E7C9 /* URLParameterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLParameterTests.swift; sourceTree = "<group>"; };
145+
9F4A1BBD1F97AF0F00154997 /* XCTestCase+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Utilities.swift"; sourceTree = "<group>"; };
141146
/* End PBXFileReference section */
142147

143148
/* Begin PBXFrameworksBuildPhase section */
@@ -261,6 +266,7 @@
261266
291272CC1C75EECB00FB1BBD /* UIView+Utilities.swift */,
262267
296831481DD5EC670002FE5A /* DispatchTime+Utilities.swift */,
263268
838A0F961F03F57E00469143 /* String+HTML.swift */,
269+
42FB12122063D04900F850D1 /* URLSession+Codable.swift */,
264270
);
265271
path = Extensions;
266272
sourceTree = "<group>";
@@ -581,6 +587,7 @@
581587
01CD40631D071BCB0044887E /* Then.swift in Sources */,
582588
01CD40851D071BDC0044887E /* String+CaseConverter.swift in Sources */,
583589
01CD408A1D071BDC0044887E /* NSError+Utilities.swift in Sources */,
590+
42FB12142063D04900F850D1 /* URLSession+Codable.swift in Sources */,
584591
01CD40651D071BCB0044887E /* Operators.swift in Sources */,
585592
01CD40871D071BDC0044887E /* String+EmailValidation.swift in Sources */,
586593
01CD40621D071BCB0044887E /* Application.swift in Sources */,
@@ -614,6 +621,7 @@
614621
01CD407D1D071BDC0044887E /* String+EmailValidation.swift in Sources */,
615622
01CD40661D071BCC0044887E /* Application.swift in Sources */,
616623
01CD407C1D071BDC0044887E /* String+Range.swift in Sources */,
624+
42FB12152063D04900F850D1 /* URLSession+Codable.swift in Sources */,
617625
);
618626
runOnlyForDeploymentPostprocessing = 0;
619627
};
@@ -633,6 +641,7 @@
633641
01CD40741D071BDB0044887E /* CGRect+Utilities.swift in Sources */,
634642
01CD40751D071BDB0044887E /* CGPoint+Utilities.swift in Sources */,
635643
01CD40791D071BDB0044887E /* UIImage+Utilities.swift in Sources */,
644+
42FB12162063D04900F850D1 /* URLSession+Codable.swift in Sources */,
636645
01CD406B1D071BCC0044887E /* Then.swift in Sources */,
637646
01CD40711D071BDB0044887E /* String+CaseConverter.swift in Sources */,
638647
01CD40761D071BDB0044887E /* NSError+Utilities.swift in Sources */,
@@ -663,6 +672,7 @@
663672
293490F01C6CAFF200E8305E /* Then.swift in Sources */,
664673
0132B4CF1C70E616007BC588 /* NSError+Utilities.swift in Sources */,
665674
291272C11C75ED3900FB1BBD /* UIColor+Hex.swift in Sources */,
675+
42FB12132063D04900F850D1 /* URLSession+Codable.swift in Sources */,
666676
);
667677
runOnlyForDeploymentPostprocessing = 0;
668678
};
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//
2+
// URLSession+Codable.swift
3+
// Codemine
4+
//
5+
// Created by Andrei Hogea on 22/03/2018.
6+
// Copyright © 2018 Nodes. All rights reserved.
7+
//
8+
9+
10+
import Foundation
11+
12+
// Decoded Result
13+
public enum DResult<Value> {
14+
case success(Value)
15+
case successWithError(Value, Error)
16+
case failure(Error)
17+
}
18+
19+
public extension URLSession {
20+
21+
/**
22+
Adds a handler that attempts to parse the result of the request into a **Decodable**
23+
24+
- parameter requestCompletion: The URLSession.dataTask completion
25+
26+
- returns: The Decoded Result (DResult)
27+
*/
28+
public func decode<Value: Swift.Decodable>(requestCompletion: (Data?, Error?)) -> DResult<Value> {
29+
switch requestCompletion {
30+
case (.some(let data), .some(let error)):
31+
do {
32+
let decodedData = try JSONDecoder().decode(Value.self, from: data)
33+
return .successWithError(decodedData, error)
34+
} catch let decodeError {
35+
return .failure(decodeError)
36+
}
37+
case (.some(let data), .none):
38+
do {
39+
let decodedData = try JSONDecoder().decode(Value.self, from: data)
40+
return .success(decodedData)
41+
} catch let decodeError {
42+
return .failure(decodeError)
43+
}
44+
case (.none, .some(let error)):
45+
return .failure(error)
46+
47+
case (.none, .none):
48+
let fallBackError = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Data was not retrieved from request"]) as Error
49+
return .failure(fallBackError)
50+
}
51+
}
52+
53+
/**
54+
Adds a handler that attempts to parse the result of the request into a **Decodable**
55+
56+
- parameter completion: A closure that is invoked when the request is finished, containting the desired DataModel to be returned
57+
58+
- returns: The URLSession.dataTask completion
59+
*/
60+
public func decode<Value: Swift.Decodable>(_ completion: @escaping ((DResult<Value>) -> Void)) -> ((Data?, URLResponse?, Error?) -> Void) {
61+
return { (data, _, error) in
62+
DispatchQueue.main.async {
63+
completion(self.decode(requestCompletion: (data, error)))
64+
}
65+
}
66+
}
67+
}
68+

0 commit comments

Comments
 (0)