如何在nsoperation开始和结束之前更新UI

时间:2013-08-13 14:09:53

标签: nsoperation nsoperationqueue

2部分问题,但相关的问题将保留在同一个主题中:

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

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

这样的东西
-(id)initOperationWithStartBlock:(StartBlock)startblock completionBlock:(CompletionBlock)completionBlock

但是相信有一种更好的方法可以从队列中获取它。

如何做到这一点?

我还想知道NSOperationQueue发送的工作索引。

我已经尝试过了

[[self.myQueue operations] indexForObject:operation]

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

任何保存它们的方法?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-2)

这取决于您是想在启动时还是在代码中的其他位置执行某些操作。根据你所说的(你想要更新UI),这听起来像你想要在你的对象之外采取行动,但我不知道你的程序。您有两种选择:

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

2)如果你想在对象之外执行一个动作,我宁愿建议在NSNotificationCenter中使用非常一般的NSNotification,在你的主要内部发布一个通知,例如@“willStart”和@“didComplete”。在任何其他对象中,注册为您的通知的观察者。

无论哪种方式,都不要忘记在当前线程中发送通知,但必须在主线程上更新UI。你不知道什么线程观察:keyPath:被调用。您可能需要调用performSelectorOnMainThread来更新UI,或者您甚至可以使用带有UI代码的addOperationWithBlock方便有用的nsoperationqueue mainqueue。如果您使用NotificationCenter,那么您可以使用nsobject performSelectorOnMainThread

在主线程上发布信息。