假设我有一些NSProgress
对象层次结构。为简单起见,假设有 2 个孩子的根进度。如果进度已经开始,我可以向层次结构添加另一个子进度并期望发生正确的事情吗?例如,假设我从 2 个孩子开始,所以totalUnitCount
根的 是2
和pendingUnitCount
是2
。一旦第一个孩子完成,根进度fractionCompleted
将是0.5
. 如果我然后添加另一个子进度,根进度会按我的fractionCompleted
意愿更新,但根进度保持在,就像. 我可以手动更新,但这会导致 root关闭。此外,似乎没有办法在不调用的情况下更新. 曾是~0.33
totalUnitCount
2
pendingUnitCount
totalUnitCount
fractionCompleted
pendingUnitCount
becomeCurrentWithPendingUnitCount:
NSProgress
不是为这种用途而设计的,还是有“正确”的方法来做到这一点?
我的用例是我有一个可以将文件上传到远程服务器的应用程序。用户可以选择一些文件并点击按钮开始上传它们。当他们上传时,用户会看到上传作业的整体进度。现在,如果用户想要在上传过程中选择更多要上传的照片,我想更新进度以反映新的总数。例如,他当前正在上传 2 个文件,其中 1 个已经完成,在他们正在上传的同时,他又添加了 2 个要上传。进度应自行调整。总单位数现在应该是 4,应该还有 3 个项目要上传。对我来说,这似乎是一个常见的用例。
这是我编写的用于动态扩展NSProgress
层次结构的单元测试。下面测试中的所有断言都通过了,但是如果您检查根totalUnitCount
,它始终保持为 2,并且似乎无法判断根进度还有多少项目需要完成。根进度是 UI 将观察到的进度,因此层次结构中更深层次的更改向上传播很重要,包括totalUnitCount
等。
- (void)testDynamicNSProgress
{
NSProgress *root = [NSProgress progressWithTotalUnitCount:2];
[root becomeCurrentWithPendingUnitCount:2];
NSProgress *child1 = [NSProgress progressWithTotalUnitCount:1];
NSProgress *child2 = [NSProgress progressWithTotalUnitCount:1];
XCTAssertEqual(root.totalUnitCount, 2);
XCTAssertEqual(root.completedUnitCount, 0);
child1.completedUnitCount++;
XCTAssertEqual(ceil(root.fractionCompleted * 100), 50);
NSProgress *child3 = [NSProgress progressWithTotalUnitCount:1];
NSProgress *child4 = [NSProgress progressWithTotalUnitCount:1];
XCTAssertEqual(ceil(root.fractionCompleted * 100), 25);
child2.completedUnitCount++;
XCTAssertEqual(ceil(root.fractionCompleted * 100), 50);
child3.completedUnitCount++;
XCTAssertEqual(ceil(root.fractionCompleted * 100), 75);
child4.completedUnitCount++;
XCTAssertEqual(ceil(root.fractionCompleted * 100), 100);
__unused NSProgress *child5 = [NSProgress progressWithTotalUnitCount:1];
XCTAssertEqual(ceil(root.fractionCompleted * 100), 80);
}