@@ -10,44 +10,73 @@ import Foundation
1010class RequestConsolidator {
1111 var requestCallbacks : [ RequestWithCallback ]
1212 var service : DevCycleServiceProtocol
13+ var requestInFlight : Bool
1314
1415 init ( service: DevCycleServiceProtocol ) {
1516 self . service = service
1617 self . requestCallbacks = [ ]
18+ self . requestInFlight = false
1719 }
1820
1921 func queue( request: URLRequest , callback: @escaping ConfigCompletionHandler ) {
20- let configComplete : ConfigCompletionHandler = { config in
21- if let lastRequestCallback = self . requestCallbacks. last, lastRequestCallback. request == request {
22- for requestCallback in self . requestCallbacks {
23- requestCallback. callback ( config)
22+ if ( self . requestInFlight) {
23+ self . requestCallbacks. append (
24+ RequestWithCallback (
25+ callback: callback,
26+ request: request
27+ )
28+ )
29+ return
30+ }
31+
32+ self . requestInFlight = true
33+ service. makeRequest ( request: request) { response in
34+ if ( self . requestCallbacks. isEmpty) {
35+ guard let config = processConfig ( response. data) else {
36+ callback ( ( nil , response. error) )
37+ return
38+ }
39+ callback ( ( config, response. error) )
40+ self . requestInFlight = false
41+ } else {
42+ self . requestCallbacks. insert (
43+ RequestWithCallback (
44+ callback: callback,
45+ request: request
46+ ) ,
47+ at: 0
48+ )
49+ self . makeLastRequestInQueue {
50+ self . requestInFlight = false
2451 }
25- self . requestCallbacks = [ ]
2652 }
2753 }
28- self . requestCallbacks. append (
29- RequestWithCallback (
30- callback: callback,
31- request: request,
32- service: self . service,
33- finish: configComplete
34- )
35- )
54+ }
55+
56+ func makeLastRequestInQueue( complete: ( ( ) -> Void ) ? ) {
57+ guard let lastRequest = self . requestCallbacks. last? . request else {
58+ print ( " No last request to make in queue " )
59+ return
60+ }
61+ service. makeRequest ( request: lastRequest) { response in
62+ for requestCallback in self . requestCallbacks {
63+ guard let config = processConfig ( response. data) else {
64+ requestCallback. callback ( ( nil , response. error) )
65+ return
66+ }
67+ requestCallback. callback ( ( config, response. error) )
68+ }
69+ self . requestCallbacks = [ ]
70+ complete ? ( )
71+ }
3672 }
3773}
3874
39- class RequestWithCallback {
75+ struct RequestWithCallback {
4076 var callback : ConfigCompletionHandler
4177 var request : URLRequest
42- init ( callback: @escaping ConfigCompletionHandler , request: URLRequest , service : DevCycleServiceProtocol , finish : @escaping ConfigCompletionHandler ) {
78+ init ( callback: @escaping ConfigCompletionHandler , request: URLRequest ) {
4379 self . callback = callback
4480 self . request = request
45- service. makeRequest ( request: request) { response in
46- guard let config = processConfig ( response. data) else {
47- finish ( ( nil , response. error) )
48- return
49- }
50- finish ( ( config, response. error) )
51- }
5281 }
5382}
0 commit comments