【问题标题】:NSOperation with NSTimer loop how to stop itNSOperation 与 NSTimer 循环如何停止它
【发布时间】:2015-08-26 09:09:36
【问题描述】:

我的 NSOperationQueue 运行在另一个线程上,而不是整个应用程序。我正在将 NSOperation 添加到 main 中的队列中

-(void)main{
     [self updatePallets];
     NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval: 5.0 target:self selector: @selector(updatePallets) userInfo: nil repeats: Yes];
     NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
     [runLoop addTimer:timer forMode: NSRunLoopCommonModes];
     [runLoop run];
}

它可以按我的意愿正常工作。但是如何取消这种类型的操作。例如,在我的主线程上,我想做这样的事情:

[queue cancelAllOperations];
[queue waitUntilAllOperationsAreFinished];

我想挂起主线程并等待它完成。然后执行一些动作。但是它不会取消任何操作(定时器只有一个)我该怎么办?我还尝试在调度程序弹出时间后向队列添加新操作,但仍然无法停止。

【问题讨论】:

  • 您是否使计时器无效? [timer invalidate]
  • 不,我只是试图取消操作。所以我需要参考计时器......是否可以取消所有操作,然后停止所有操作?我可以在runLoop中添加一些条件吗?
  • 我不确定 cancelAllOperations。但是对于 NSTimer,我使用的是[timer invalidate]
  • 我创建了@property (strong, atomic) NSTimer * timer 和方法-(void)stopOperation{[self.timer invalidate]} 之后我从队列中获取所有操作并设置它们stopOperation 然后我把cancelAllOperations 放在那里,然后再次从队列中获取所有操作有timer = nil 所以应该停止并从队列中删除?
  • 嗯,我会赞成这个问题让其他兄弟注意到。

标签: ios objective-c multithreading nsoperation nsoperationqueue


【解决方案1】:

我发现了类似的东西:

从运行循环中手动删除所有已知的输入源和计时器并不能保证运行循环将退出。 OS X 可以根据需要安装和删除额外的输入源,以处理针对接收者线程的请求。因此,这些来源可能会阻止运行循环退出。

如果您希望运行循环终止,则不应使用此方法。相反,请使用其他运行方法之一,并在循环中检查您自己的其他任意条件。

所以我添加了while 循环。但是不知道有没有效率……

while(self.timer.valid && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]);

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 2011-03-31
    • 1970-01-01
    • 2015-12-08
    • 2011-12-24
    • 2018-05-13
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多