Skip to content

Commit 2da9049

Browse files
committed
Fix memory leaks in Promise whenAll
1 parent de705bc commit 2da9049

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

Sources/Apollo/Promise.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Dispatch
33
func whenAll<Value>(_ promises: [Promise<Value>], notifyOn queue: DispatchQueue = .global()) -> Promise<[Value]> {
44
return Promise { (fulfill, reject) in
55
let group = DispatchGroup()
6+
var rejected = false
67

78
for promise in promises {
89
group.enter()
@@ -11,11 +12,15 @@ func whenAll<Value>(_ promises: [Promise<Value>], notifyOn queue: DispatchQueue
1112
group.leave()
1213
}.catch { error in
1314
reject(error)
15+
rejected = true
16+
group.leave()
1417
}
1518
}
1619

1720
group.notify(queue: queue) {
18-
fulfill(promises.map { $0.result!.value! })
21+
if !rejected {
22+
fulfill(promises.map { $0.result!.value! })
23+
}
1924
}
2025
}
2126
}

Sources/Apollo/ResultOrPromise.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func whenAll<Value>(_ resultsOrPromises: [ResultOrPromise<Value>], notifyOn queu
1919

2020
return .promise(Promise { (fulfill, reject) in
2121
let group = DispatchGroup()
22+
var rejected = false
2223

2324
for resultOrPromise in resultsOrPromises {
2425
group.enter()
@@ -27,11 +28,15 @@ func whenAll<Value>(_ resultsOrPromises: [ResultOrPromise<Value>], notifyOn queu
2728
group.leave()
2829
}.catch { error in
2930
reject(error)
31+
rejected = true
32+
group.leave()
3033
}
3134
}
3235

3336
group.notify(queue: queue) {
34-
fulfill(resultsOrPromises.map { $0.result!.value! })
37+
if !rejected {
38+
fulfill(resultsOrPromises.map { $0.result!.value! })
39+
}
3540
}
3641
})
3742
}

0 commit comments

Comments
 (0)