在Windows中,可以在代码中运行事件。
//PeekMessage loop example
while (WM_QUIT != uMsg.message)
{
while (PeekMessage (&uMsg, NULL, 0, 0, PM_REMOVE) > 0) //Or use an if statement
{
TranslateMessage (&uMsg);
DispatchMessage (&uMsg);
}
}在Objective-C for iOS中,有没有一种方法可以使事件间歇性地在for循环中运行?
我有一些嵌套很深的代码,需要一些时间才能运行,我想让它间歇性地更新进度。重新设计深度嵌套的代码并不是一个真正的选择,它可以在其他操作系统上运行。
发布于 2017-02-19 00:43:13
因此,您基本上希望运行一个长时间的任务并相应地更新进度。这可以在Objective-C中使用GCD和NSOperationQueue来完成。下面的代码给出了一个这样的例子。
在这里,我将使用一个函数,它接受一个块作为输入。该函数包含异步代码。
typedef void(^ProgressBlock)(CGFloat progress); // defined block
- (void)executeTaskWithProgress:(ProgressBlock)progress; // defined function您可以通过以下两种方式异步运行任务:
使用GCD
NSOperation您可以通过以下方式调用函数:
[self executeTaskWithProgress:^(CGFloat progress) {
[self.myLabel setText:[NSString stringWithFormat:@"%f completed", progress]];
// myLabel is an UILabel object
}];有关在Objective-C中使用GCD进行异步编程的更多详细信息,建议您查看以下tutorial。如果有任何疑问,请随时询问
发布于 2017-02-18 22:42:35
您可以通过在控制器中使用NSTimer来执行此操作,如下所示:
- (void)viewDidLoad {
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timerCalled) userInfo:nil repeats:YES];
}
-(void)timerCalled
{
NSLog(@"timer called");
}发布于 2017-02-18 22:56:30
我不熟悉现代Windows异步编程技术,也不熟悉PeekMessage函数。您应该用通用的CS术语来解释它的作用。
这听起来像是在做耗时的任务时响应系统事件的一种方式。
iOS使用了一种稍微不同的方法。它是一个在主线程上运行“事件循环”的多线程操作系统。每次通过事件循环,系统都会检查需要响应的事件(触摸事件、通知、进入WiFi或手机网络的数据、屏幕更新等)。并处理它们。
您需要编写在主线程上运行的代码,以执行响应用户操作或系统事件的简短任务,然后返回。您不应该在主线程上执行耗时的任务。
有一个称为中央分派的框架,它为在后台线程(或主线程)上运行任务提供高级支持。还有NSOperationQueues,它支持管理在主线程或后台并发或并行运行的任务队列。
这两个操作系统使用不同的范例来处理事件和并发,并且很可能没有简单的“使用此函数”来替代您当前的处理方式。
您可能应该重构长期运行的任务,使其在后台线程上运行,然后在想要更新用户界面时将消息发送到主线程。
https://stackoverflow.com/questions/42316289
复制相似问题