0

2部分问题但相关,因此将保留在同一个线程中:

我正在添加NSOperations一个NSOperationQueue. 我需要知道操作何时开始以及何时结束以更新 UI。

我考虑添加一个“启动处理程序”块以在 nsoperation 中运行,以及在 NSOperation 中添加一个“完成处理程序”

就像是

-(id)initOperationWithStartBlock:(StartBlock)startblock completionBlock:(CompletionBlock)completionBlock

但相信有更好的方法可以从队列本身中获取它。

如何才能做到这一点?

我也想知道 NSOperationQueue 发送的作业的索引。

我试过做

[[self.myQueue operations] indexForObject:operation]

但索引始终是第零个索引 - 因为在我检查作业索引之前,已完成的作业已从 nsoperationqueue 数组中删除。

有什么方法可以保存它们吗?

4

2 回答 2

0

您需要在 IOS 中使用 Key-Value-Observing 模式。因此,为此您需要在控制器中设置观察者以查找对 isFinished 和 isExecuting 的更改以捕获开始和结束挂钩。

于 2013-08-13T14:12:38.643 回答
-2

这取决于您是否想在开始时或代码中的其他位置从对象内执行某些操作。从你所说的(你想更新 UI)来看,这听起来像是你想在你的对象之外行动,但我不知道你的程序。你有两个选择:

1)如果您想在从同一对象内开始操作时对您的对象进行操作,请使用键值观察和观察 isExecuting 与 self 作为观察者和被观察者。不要忘记无论是从 NO 到 YES(开始)还是从 YES 到 NO(完成),您都会被调用。

2)如果您想在对象之外执行操作,我宁愿建议使用非常通用的 NSNotification 和 NSNotificationCenter 并在您的主目录中发布通知,例如 @"willStart" 和 @"didComplete"。在任何其他对象中,注册为通知的观察者。

无论哪种方式,不要忘记通知是在当前线程中发送的,但 UI 必须在主线程上更新。您不知道在哪个线程上调用了 observe:keyPath:。您可能需要调用 performSelectorOnMainThread 来更新 UI,或者您甚至可以在 UI 代码中使用方便且有用的 nsoperationqueue mainqueue 和 addOperationWithBlock。如果您使用 NotificationCenter,那么您可以简单地使用 nsobject performSelectorOnMainThread 在主线程上发布

于 2013-08-25T06:40:30.123 回答