首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS如何确定阻塞UI的原因

iOS如何确定阻塞UI的原因
EN

Stack Overflow用户
提问于 2013-04-10 22:01:38
回答 6查看 24.2K关注 0票数 32

我是iOS开发的新手,但我开始掌握一些更复杂的概念。我目前有一个应用程序,它实现了一个AVCam来捕获视频。AVCam是在一个单独的线程上创建的,但是使用了我的主xib文件中的一个视图。当摄像机完成捕获后,它将调用我的ViewController类中的一个完整函数。在完整的函数中,我调用了许多用于更新UI的其他函数以及一些NSLogs。一切似乎都很正常,我立即在控制台中看到了日志,但UI又需要3秒才能更新。我尝试使用工具来查找违规代码,但我似乎找不到它。有没有其他方法来确定什么是被UI阻止的?

以下是录制完成时调用的代码;

代码语言:javascript
复制
-(void)movieRecordingCompleted{
       [HUD hide:YES];
        NSLog(@"movieRecordingCompleted");
        [self showModalViewController];
        NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mov"];
        NSLog(@"pathToMovie: %@", pathToMovie);
        pathToTreatedVid = pathToMovie;
        NSLog(@"File Save Called");
        UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, NULL, NULL);
}

一切都会立即被记录下来,但是进度HUD和模式视图控制器在大约2-5秒内不会触发,这非常奇怪。

下面是线程之前和之后的状态(冻结时与解冻时)。

EN

回答 6

Stack Overflow用户

发布于 2013-04-10 22:09:03

尝试暂停程序执行(在Xcode的底部面板中有一个按钮,第三个按钮)

  • ,然后查看左侧面板(Navigator panel),
  • Find Debug Navigator

  • 使用main函数查找线程,mb你可以通过这个线程中的方法找出是什么花了这么长时间来更新你的UI。目前有效的方法通常是最顶层的黑色方法(带有灰色列出的obj-c内部方法)。

票数 51
EN

Stack Overflow用户

发布于 2017-02-02 09:08:17

您可以通过在配置文件模式下运行应用程序来使用Instruments中的系统跟踪工具。然后,您将获得系统中所有线程的详细运行,以及线程所经历的每个调度事件的堆栈跟踪。

有一个来自2016年WWDC System Trace in Depth的很棒的视频,它将带你调试一个阻塞的线程问题。

这比时间分析器仪器要好得多,因为该工具的工作原理是每隔一段时间对CPU上运行的内容进行采样。然而,如果你的线程被阻塞了,它就不是在CPU上运行的,所以-它不会被采样。你的主线程可能被阻塞了整整一秒,但它不会在Time Profiler中显示出来。

票数 18
EN

Stack Overflow用户

发布于 2013-04-10 22:07:42

您可以使用Time Profiler找出阻止您的应用程序的原因。

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

https://stackoverflow.com/questions/15928035

复制
相关文章

相似问题

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