【发布时间】:2014-04-21 17:23:07
【问题描述】:
假设我有一些NSProgress 对象的层次结构。为简单起见,假设有 2 个孩子的根进度。如果进度已经开始,我可以向层次结构添加另一个子进度并期望发生正确的事情吗?例如,假设我从 2 个孩子开始,所以根的 totalUnitCount 是 2,pendingUnitCount 是 2。一旦第一个孩子完成,根进度'fractionCompleted 将是0.5。如果我再添加另一个子进程,根进程'fractionCompleted 确实会更新为~0.33,但根的totalUnitCount 仍为2,pendingUnitCount 也是如此。我可以手动更新totalUnitCount,但这会使根的fractionCompleted 关闭。此外,似乎没有办法在不调用becomeCurrentWithPendingUnitCount: 的情况下更新pendingUnitCount。 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);
}
【问题讨论】:
-
当我想做类似的事情时,我发现我必须手动增加根
NSProgress对象的totalUnitCount。据我所知,在层次结构上报告的总体进度还可以,但除非您手动更改它,否则根单元的总数不会改变(NSProgress的totalUnitCount属性是可变的,所以我是每当我准备去becomeCurrentWithPendingUnitCount做下一个任务时,我就在做parentProgress.totalUnitCount += <whatever>;。) -
嗨,马特,我一直在搞这个。似乎如果我更新根的 totalUnitCount 并按该顺序添加另一个子级,那么根的 fractionComplete 将是正确的,但 completedUnitCount 以及根的localizedDescription 和localizedAdditionalDescription 中的消息不是。
-
* 创建根和 2 个孩子 * child1.completedUnitCount++ * "50% 完成"、"1 of 2" * child2.completedUnitCount++ * "100% 完成"、"2 of 2" * root.totalUnitCount = 3 * add child3 * child3.completedUnitCount++ * "66% completed", "1 of 3" 66% 是对的,但应该是 2 of 3。如果我在添加 child3 之前手动设置 root.completedUnitCount = 2,那么 fractionCompleted 变为不正确。
标签: ios nsprogress