I first discovered this behavior while using the MultipeerConnectivity framework by building a progress tree for sending multiple files via MCSession.sendResource (which by the way is much stranger than the result of the code below: fractionCompleted jumps all over the place, e.g. from 0.5 to 1.4 to 0.7 to 2.8)
I know that the property fractionCompleted is not supposed to be used for checking completion, however it is meant to be used for the UI, hence anything above 1.0 is not acceptable.
The following code causes Progress.fractionCompleted property to exceed 1.
let childUnitCounts: [(initialCompletedUnitCount: Int64, totalUnitCount: Int64)] = [
(9855, 34375),
(10950, 19110),
(9855, 37511),
(9855, 18799),
(9855, 42705),
(10950, 19021), // When commenting out this line or setting the initial unit count to 0, things work as expected.
]
let parent = Progress()
parent.totalUnitCount = Int64(childUnitCounts.count)
let children: [Progress] = childUnitCounts.map { unitCount in
let child = Progress(totalUnitCount: unitCount.totalUnitCount)
child.completedUnitCount = unitCount.initialCompletedUnitCount
parent.addChild(child, withPendingUnitCount: 1)
return child
}
print(parent)
for (i, state) in childUnitCounts.enumerated() {
children[i].completedUnitCount = state.totalUnitCount
print(parent)
}
And this is the output:
<NSProgress: 0x600000170820> : Parent: 0x0 (portion: 0) / Fraction completed: 0.4088 / Completed: 0 of 6
<NSProgress: 0x6000001708c0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2867 / Completed: 9855 of 34375
<NSProgress: 0x600000170be0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5757 / Completed: 10950 of 19021
<NSProgress: 0x600000170b40> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2308 / Completed: 9855 of 42705
<NSProgress: 0x600000170aa0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5242 / Completed: 9855 of 18799
<NSProgress: 0x600000170a00> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2627 / Completed: 9855 of 37511
<NSProgress: 0x600000170960> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5730 / Completed: 10950 of 19110
<NSProgress: 0x600000170820> : Parent: 0x0 (portion: 0) / Fraction completed: 0.5277 / Completed: 1 of 6
<NSProgress: 0x600000170be0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5757 / Completed: 10950 of 19021
<NSProgress: 0x600000170b40> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2308 / Completed: 9855 of 42705
<NSProgress: 0x600000170aa0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5242 / Completed: 9855 of 18799
<NSProgress: 0x600000170a00> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2627 / Completed: 9855 of 37511
<NSProgress: 0x600000170960> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5730 / Completed: 10950 of 19110
<NSProgress: 0x600000170820> : Parent: 0x0 (portion: 0) / Fraction completed: 0.5989 / Completed: 2 of 6
<NSProgress: 0x600000170be0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5757 / Completed: 10950 of 19021
<NSProgress: 0x600000170b40> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2308 / Completed: 9855 of 42705
<NSProgress: 0x600000170aa0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5242 / Completed: 9855 of 18799
<NSProgress: 0x600000170a00> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2627 / Completed: 9855 of 37511
<NSProgress: 0x600000170820> : Parent: 0x0 (portion: 0) / Fraction completed: 0.8094 / Completed: 3 of 6
<NSProgress: 0x600000170be0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5757 / Completed: 10950 of 19021
<NSProgress: 0x600000170b40> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2308 / Completed: 9855 of 42705
<NSProgress: 0x600000170aa0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5242 / Completed: 9855 of 18799
<NSProgress: 0x600000170820> : Parent: 0x0 (portion: 0) / Fraction completed: 0.8886 / Completed: 4 of 6
<NSProgress: 0x600000170be0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5757 / Completed: 10950 of 19021
<NSProgress: 0x600000170b40> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.2308 / Completed: 9855 of 42705
<NSProgress: 0x600000170820> : Parent: 0x0 (portion: 0) / Fraction completed: 1.0169 / Completed: 5 of 6
<NSProgress: 0x600000170be0> : Parent: 0x600000170820 (portion: 1) / Fraction completed: 0.5757 / Completed: 10950 of 19021
<NSProgress: 0x600000170820> : Parent: 0x0 (portion: 0) / Fraction completed: 1.2795 / Completed: 6 of 6
Please help me understand what I am missing or doing wrong.