gpt4 book ai didi

objective-c - 对于 NSProgress,完成处理程序是用于 UI 还是下载 Controller ?

转载 作者:太空狗 更新时间:2023-10-30 03:45:31 27 4
gpt4 key购买 nike

我正在使用 NSProgress在我的 iOS 应用程序中传达文件下载的进度。这是一个非常通用的类,我有点害怕它的内在功能,尤其是它的两个完成处理属性。有一个用于处理取消,一个用于处理暂停(但没有一个用于处理完成,这可能是一个命中……)

这些处理程序的用途是什么?执行下载的代码可以将逻辑放入其中以处理用户发起的取消和暂停。但是,没有什么可以阻止客户端用 UI 代码覆盖处理程序。

那么,它是为 UI 而设计的吗?我不确定这是一个有用的模式,因为 UI 无论如何都会发起取消或暂停。此外,如果您使用进度对象同时显示多个 UI 元素的进度(MacOS 中的使用方式),则不同的 UI 元素可能都需要自己的完成处理程序。

使用处理程序将用户操作传回下载 Controller 似乎是最有用的模式,但我希望处理程序在初始化时设置,然后保持只读状态。

我在这里错过了什么?

(P.S. 现在我根本不打算使用那些处理程序并依赖 KVO。但是,我有一种痒痒的感觉,我错过了类(class)背后的一些基本思想)

最佳答案

我相信您缺少的关键是 NSProgress 类被设计为用作进度对象树。此外,这棵树是隐式创建的,子进程对象不需要知道它们附加到父进程,这就是它真正强大的地方。

我发现 OS X Foundation Release Notes 比 NSProgress 的类引用更有帮助:

https://developer.apple.com/library/Mac/releasenotes/Foundation/RN-Foundation/index.html

处理程序似乎可用于 UI Controller 逻辑和数据 Controller 逻辑的原因是,当您构造父子层次结构时,您有两组可用于两者的处理程序。父级的处理程序将在 UI Controller 级别(进度的“消费者”)设置,而子级的处理程序将由数据 Controller (“提供者”)设置。

由于可以使用 becomeCurrentWithPendingUnitCount: 隐式创建关系,因此子进度对象将与父进度对象隔离,这将减轻您对客户端用自己的数据级处理程序覆盖任何数据级处理程序的担忧。

在进度对象上调用 pausecancel 会将该调用传播到树中,并在途中调用任何处理程序。

一个例子:

// UI controller level, probably a UIViewController subclass.
- (void)handleDoSomethingButtonTapped:(UIButton *)sender
{
self.progressThatWeObserve =
[NSProgress progressWithTotalUnitCount:100]; // 100 is arbitrary
self.progressThatWeObserve.pausingHandler = ^{
// Update UI, reflect paused state ...
};

[self.progressThatWeObserve becomeCurrentWithPendingUnitCount:100];
[self.dataController doSomethingInBackgroundWithCompletionHandler:^{
// Update UI, remove from view ...
}];
[self.progressThatWeObserve resignCurrent];
}

// Data controller level, a SomethingManager class maybe.
- (void)doSomethingInBackgroundWithCompletionHandler:(void (^)(void)completionHandler
{
self.progressThatWeManipulate =
[NSProgress progressWithTotalUnitCount:289234]; // e.g. bytes to upload
self.progressThatWeManipulate.pausingHandler = ^{
// Actually suspend the network operation ...
};

dispath_async(self.workerQueue, ^{
// Periodically update progress
});
}

请注意,我实际上并没有做过任何这些,这都是阅读文档的理论。

关于objective-c - 对于 NSProgress,完成处理程序是用于 UI 还是下载 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18959540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com