说我有一些NSProgress对象的层次结构.为简单起见,请说2个孩子的根进度.如果已经开始进度,我可以在层次结构中添加另一个子进程并期望正确的事情发生吗?例如,假设我开始与2个孩子,所以totalUnitCount根是2和pendingUnitCount是2.一旦第一个孩子完成,根本进展' fractionCompleted将是0.5.如果我然后添加另一个子进程,则根进度' fractionCompleted会~0.33按照我的意愿更新到,但是根目录totalUnitCount仍然保留2,以及pendingUnitCount.我可以totalUnitCount手动更新,但这会抛出root fractionCompleted.此外,似乎没有办法更新pendingUnitCount没有调用becomeCurrentWithPendingUnitCount:.是NSProgress不适合这种用途的或者是有一个"正确"的方式做到这一点?
我的用例是我有一个可以将文件上传到远程服务器的应用程序.用户可以选择一些文件并点击按钮开始上传它们.在他们上传时,用户可以看到上传作业的整体进度.现在,如果用户想要在上传已经进行时选择要上传的更多照片,我想更新进度以反映新的总数.例如,他目前正在上传2个文件,1个已经完成,当他们上传时,他还增加了2个上传文件.进展应该自我调整.现在总单位数应为4,并且还有3个项目要上传.对我来说这似乎是一个常见的用例.
这是我用动态扩展NSProgress层次结构编写的单元测试.下面测试中的所有断言都会通过,但是如果你检查根目录,totalUnitCount那么它总是保持为2,并且似乎没有办法告诉根目录进度还有多少项目需要完成.UI的进度是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 = …Run Code Online (Sandbox Code Playgroud)