首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相当于Win32 PeekMessage/Translate/Dispatch的iOS Objective-C

相当于Win32 PeekMessage/Translate/Dispatch的iOS Objective-C
EN

Stack Overflow用户
提问于 2017-02-18 22:17:58
回答 3查看 54关注 0票数 0

在Windows中,可以在代码中运行事件。

代码语言:javascript
复制
//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循环中运行?

我有一些嵌套很深的代码,需要一些时间才能运行,我想让它间歇性地更新进度。重新设计深度嵌套的代码并不是一个真正的选择,它可以在其他操作系统上运行。

EN

回答 3

Stack Overflow用户

发布于 2017-02-19 00:43:13

因此,您基本上希望运行一个长时间的任务并相应地更新进度。这可以在Objective-C中使用GCDNSOperationQueue来完成。下面的代码给出了一个这样的例子。

在这里,我将使用一个函数,它接受一个块作为输入。该函数包含异步代码。

代码语言:javascript
复制
typedef void(^ProgressBlock)(CGFloat progress); // defined block

- (void)executeTaskWithProgress:(ProgressBlock)progress; // defined function

您可以通过以下两种方式异步运行任务:

使用GCD

  • (void)executeTaskWithProgress:(ProgressBlock)progress { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0)的进度更新,^{ //您的长时间运行任务//下面一行用于更新进度(dispatch_get_main_queue(),^{ (20.0);});});}
  1. Using NSOperation
  • (void)executeTaskWithProgress:(ProgressBlock)progress { NSOperationQueue *executionQueue = [NSOperationQueue分配初始化];NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //您的长时间运行任务//下一行用于更新进度[NSOperationQueue mainQueue addOperationWithBlock:^{ NSOperationQueue(20.0);}];}];executionQueue addOperation:operation;}

您可以通过以下方式调用函数:

代码语言:javascript
复制
[self executeTaskWithProgress:^(CGFloat progress) {
    [self.myLabel setText:[NSString stringWithFormat:@"%f completed", progress]];
    // myLabel is an UILabel object
}];

有关在Objective-C中使用GCD进行异步编程的更多详细信息,建议您查看以下tutorial。如果有任何疑问,请随时询问

票数 1
EN

Stack Overflow用户

发布于 2017-02-18 22:42:35

您可以通过在控制器中使用NSTimer来执行此操作,如下所示:

代码语言:javascript
复制
- (void)viewDidLoad {
    [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timerCalled) userInfo:nil repeats:YES];
}

-(void)timerCalled
{
    NSLog(@"timer called");
}
票数 0
EN

Stack Overflow用户

发布于 2017-02-18 22:56:30

我不熟悉现代Windows异步编程技术,也不熟悉PeekMessage函数。您应该用通用的CS术语来解释它的作用。

这听起来像是在做耗时的任务时响应系统事件的一种方式。

iOS使用了一种稍微不同的方法。它是一个在主线程上运行“事件循环”的多线程操作系统。每次通过事件循环,系统都会检查需要响应的事件(触摸事件、通知、进入WiFi或手机网络的数据、屏幕更新等)。并处理它们。

您需要编写在主线程上运行的代码,以执行响应用户操作或系统事件的简短任务,然后返回。您不应该在主线程上执行耗时的任务。

有一个称为中央分派的框架,它为在后台线程(或主线程)上运行任务提供高级支持。还有NSOperationQueues,它支持管理在主线程或后台并发或并行运行的任务队列。

这两个操作系统使用不同的范例来处理事件和并发,并且很可能没有简单的“使用此函数”来替代您当前的处理方式。

您可能应该重构长期运行的任务,使其在后台线程上运行,然后在想要更新用户界面时将消息发送到主线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42316289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档