- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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:
隐式创建关系,因此子进度对象将与父进度对象隔离,这将减轻您对客户端用自己的数据级处理程序覆盖任何数据级处理程序的担忧。
在进度对象上调用 pause
或 cancel
会将该调用传播到树中,并在途中调用任何处理程序。
一个例子:
// 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/
我正在实现NSProgress支持库,我编写了一些单元测试来测试一切是否正常工作。虽然理想情况下我希望能够传递一些额外的元数据( userInfo key 不被 NSProgress 本身使用,但供我
在 AFNetworking 中我找到了这个函数: - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
我有两个不同的大任务,每个任务都有几个子任务。每个子任务都有一个我手动更新的子 NSProgress。每个大任务都有一个父 NSProgress 和几个 [progress becomeCurrent
我想将属性观察器添加到 NSProgress。我有这段代码,但它只调用了一次。 var progress: NSProgress? { didSet { println
我有一个包含多个子任务的大任务。我想为那个大任务添加进度报告。 为此,我想使用 NSProgress,根据类文档,我可以通过使用它的子-父机制来完成这种子任务进度。 为了简化它,假设我有一个包含一个子
我正在试验 NSProgress,发现后台线程上的一个简单循环会导致内存快速增长: class Worker { var progress:NSProgress? func doWor
我正在尝试使用 Alamofire 下载文件,但有进展。但我在 progress 行收到此错误。 无法调用非函数类型“NSProgress”的值 有什么问题?我见过的所有例子,即 the offici
我使用 [manager downloadTaskWithRequest:request Progress:&progress destination:^NSURL *(NSURL *targetPa
NSProgress允许用户取消或恢复工作。您可以通过调用 pause 来暂停 NSProgress 对象。 如何恢复暂停的 NSProgress 对象? NSProgress 的文档实际上并未提及恢
假设我有一些 NSProgress 对象的层次结构。为简单起见,假设有 2 个 child 的 root progress。如果进度已经开始,我可以向层次结构添加另一个子进度并期望正确的事情发生吗?例
我正在尝试使用 AFNetworking 和 NSProgress 跟踪我的 HTTP 请求的进度。基本上,我的请求是一个包含文本参数和图像数据的多部分表单数据,所有这些都在一个 block 中。 这
根据documentation for NSProgress我看到 -[NSProgress localizedAdditionalDescription] 可以报告下载速度和剩余时间,例如: 1.6
我正在使用 KVO 来跟踪正在接收的文件的进度: -(void)session:(MCSession *)session didStartReceivingResourceWithName:(NSSt
(void)URLSession:(NSURLSession *)session 任务:(NSURLSessionTask *)任务didSendBodyData:(int64_t)bytesSent
我正在使用 AFNetworking 3.1.0 并且GET:parameters:success:failure 已弃用,因此我想使用 GET:parameters:progress:success
我已经使用乘数连接从循环中为连接的对等点实现了文件发送功能。即代码如下。 for connectedPeer in self.connectedPeers { let sendingPr
我有这个观察者,我正在尝试以这种方式更新我的 UIProgressView: - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(
我使用 NSProgress 来通知复杂任务的进度(该任务由许多子任务组成,可以由其他子任务组成)。 我在 startTask 方法中创建主要进度: - (void)_startTask {
我又回来了蜂群思维! 在我的 ViewController 类中,我有一个函数可以循环访问数组中的一系列项目。我想要发生的是在循环的每次迭代中更新我的进度条,但它似乎在完成整个循环并退出我的函数之前不
我目前正在使用 owncloud iOS SDK将文件上传到我的私有(private)云。我正在尝试引入 Key-Value 观察机制 provided in this example到 swift
我是一名优秀的程序员,十分优秀!