首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CustomDelegate on viewDidLoad

CustomDelegate on viewDidLoad
EN

Stack Overflow用户
提问于 2015-03-22 16:37:40
回答 1查看 51关注 0票数 0

我在viewDidLoad上调用一个属于自定义委托类的方法,但它从[sampleProtocol startSampleProcess]开始,从sleep(5)开始,然后再向我展示视图控制器和label1。

代码语言:javascript
复制
CustomDelegate *sampleProtocol = [[CustomDelegate alloc]init];
sampleProtocol.delegate = self;
[self.label1 setText:@"Processing..."];
[sampleProtocol startSampleProcess];

startSampleProcess法在此基础上;

代码语言:javascript
复制
-(void)startSampleProcess{

    sleep(5);

    [self.delegate processCompleted];
}

processCompleted法也在以下;

代码语言:javascript
复制
-(void)processCompleted{
    [self.label1 setText:@"Process Completed"];
}

它只是在视图控制器上设置一个标签,转到另一个类并做一些简单的事情(例如:睡眠),然后返回到查看控制器并再次设置标签。我以前没有试过定制委托,所以如果你能帮我解决我缺少的东西,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-22 17:02:36

问题是在主线程上调用sleep

以下是iOS应用程序的工作方式:

  1. 等到有趣的事情发生。
  2. 处理它。
  3. 回到第一步。

这个应用程序有一个叫做runloop的程序,它接收来自系统的关于触摸、定时器等的消息。每次收到消息,它都运行一些代码,这些代码通常是由您提供的。调用sleep函数时,它将挂起当前线程。当线程挂起时,在完成sleep之前,run循环无法处理新事件。

当您在屏幕上更改某些内容时,将向run循环添加一个事件,该事件表示需要重新绘制屏幕。因此,这就是您的应用程序中正在发生的情况:

  1. 更改标签文本。现在将重绘事件添加到run循环中。
  2. 您的sleep时间为5秒,这意味着runloop无法处理新事件。
  3. 5秒后,线程唤醒并更改标签的文本。
  4. 控件最终返回到run循环。
  5. run循环处理重绘事件,更改标签的文本。

如果任务需要长时间运行,可以在后台线程中完成:

代码语言:javascript
复制
-(void)startSampleProcess {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0) ^{  //run this code in the background so it doesn't block the runloop
        sleep(5);
        dispatch_async(dispatch_get_main_thread(), ^{    //after the task is done, call the delegate function back on the main thread since UI updates need to be done on the main thread
            [self.delegate processCompleted];
        });
    });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29196982

复制
相关文章

相似问题

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