Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSThread导致UIWebView崩溃_Iphone_Ios_Nstimer_Nsthread_Nsrunloop - Fatal编程技术网

Iphone NSThread导致UIWebView崩溃

Iphone NSThread导致UIWebView崩溃,iphone,ios,nstimer,nsthread,nsrunloop,Iphone,Ios,Nstimer,Nsthread,Nsrunloop,我想从一开始就解释我的问题。我正在使用UIWebView创建应用程序。同时,我正在捕捉用户使用该应用程序时的屏幕,并使用该图像阵列创建视频 我正在使用NSTimer获取屏幕截图。我工作得很好,但有一个问题。当用户开始滚动网页时,或者当用户按住屏幕上的触摸键时,NSTimer暂停,然后在他释放触摸键后,NSTimer继续 这是我的NSTimer,用于获取屏幕截图 assetWriterTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f/24.0

我想从一开始就解释我的问题。我正在使用UIWebView创建应用程序。同时,我正在捕捉用户使用该应用程序时的屏幕,并使用该图像阵列创建视频

我正在使用NSTimer获取屏幕截图。我工作得很好,但有一个问题。当用户开始滚动网页时,或者当用户按住屏幕上的触摸键时,NSTimer暂停,然后在他释放触摸键后,NSTimer继续

这是我的NSTimer,用于获取屏幕截图

assetWriterTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f/24.0f
                                                    target:self
                                                  selector:@selector (writeSample)
                                                  userInfo:nil
                                                   repeats:YES];
我在谷歌上搜索了这一期,大多数人都得到了和我一样的问题。因此,他们找到了一个答案,即使用nsrunlop。他们说它停止暂停NSTimer

因此,我使用了nsrunlop并将NSTimer添加到nsrunlop中,下面是我执行此操作后的代码

NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
assetWriterTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f/24.0f
                                                    target:self
                                                  selector:@selector (writeSample)
                                                  userInfo:nil
                                                   repeats:YES];

[runLoop addTimer:assetWriterTimer forMode:NSRunLoopCommonModes];
[runLoop run];
这段代码运行得很好,并且没有停止暂停NSTimer。但在我使用nsrunlop之后,我的应用程序变得非常慢。此外,将网页加载到WebView需要花费大量时间,而且滚动速度也非常慢

于是我又开始在谷歌上搜索,我发现了这个问题。这些都是在主线程中完成的,iphone不能同时处理所有事情。所以人们建议使用NSThread来解决这个问题。因此,我所做的是创建一个NSThread并将该进程附加到自定义线程

这是我应用NSThread后的代码

    [NSThread detachNewThreadSelector:@selector(launchTimer) toTarget:self withObject:nil];

 -(void)launchTimer{


    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    assetWriterTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f/24.0f
                                                        target:self
                                                      selector:@selector (writeSample)
                                                      userInfo:nil
                                                       repeats:YES];
 
    [runLoop addTimer:assetWriterTimer forMode:NSRunLoopCommonModes];
    [runLoop run];

 }


-(void) writeSample{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    //did some coding here to take screen shot
    [pool release];
}
这解决了应用程序永远变慢的问题,我的应用程序再次运行得非常顺利,但现在它带来了严重的问题。我想这是因为使用了线程。我的自定义线程和主线程现在发生冲突,导致应用程序崩溃。我在谷歌上搜索原因。我发现了一些与此类问题相关的问题,一些人回答了这些问题,并说任何UI更改都需要在主线程中完成。此外,UIWebView WebThread必须在主线程中运行

这些是我收到的一些错误报告

这些错误就像一些线程冲突。但是我不知道如何解决这个问题。我将代码用于一些没有任何Web视图或地图的本机应用程序。因此,它在没有崩溃的情况下运行良好。但是,当我使用这个应用程序,是有WebView或地图崩溃的一些时候,给我这个错误

我在这里遇到了很多麻烦,如果有人能给出一些想法或示例代码来处理线程,处理线程优先级,或者在不使用NSThreads的情况下使用NSTimer和nsrunlop,或者在不使用NSThread的情况下克服应用程序的缓慢性,任何答案都将非常有用,我期待着很快收到您的回复


谢谢。

我猜是您为捕获屏幕截图而编写的代码导致了问题。一个简单的测试是注释掉writeSample方法中的所有代码,看看应用程序是否仍然崩溃。我这样说是因为所有与UI相关的任务都应该始终在主线程中工作

我建议为计时器使用一个单独的线程,这样计时器就不会暂停,然后从writeSample方法强制屏幕捕获代码在主线程上运行

希望这有助于

首先:

一旦您使用计时器,您就可以使用运行循环—您可以轻松地:

计时器与运行循环一起工作

(这是第二段的第一句话)

这样一来,对于你的症状:

  • 通过捕捉图像阻止线程,会导致线程结巴
这不应该让你感到惊讶

  • 将工件从该螺纹上移开,释放第一个螺纹上的应力
令人震惊,我知道

好吧,鉴于您没有向我们展示任何导致同步问题的代码(读:崩溃)这个讽刺的回答是我能提供给您的所有帮助

还有阅读和内化我上面链接的文档的技巧


编辑

我只是忘了提一下:

NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
assetWriterTimer = [NSTimer scheduledTimerWithTimeInterval:blablabla];
[runLoop addTimer:assetWriterTimer forMode:NSRunLoopCommonModes];
[runLoop run];
没有多大意义,因为

-scheduledTimerWithTimeInterval:目标:选择器:用户信息:重复: 创建并返回新的NSTimer对象,并以默认模式在当前运行循环中对其进行调度

(这在中也有解释。)

本质上:当您在自己的私有线程上时,默认模式就足够了。不过,您必须确保run循环实际上正在运行


这实际上是由该代码段的最后一行完成的,但它实际上会导致您的方法在计时器取消之前不会返回…

加载UIWebView时您是否调用了任何函数?例如,[self-loadMyWebView]???@Rushi yeah当WebView开始在ViewDidLoad中加载时,它开始捕获屏幕。当它开始运行并在我滚动、单击并导航到其他页面时获取屏幕截图后。但有时当我点击一个链接,web视图导航到另一个页面时,应用程序会崩溃,它会崩溃。你能给行[NSThread detachNewThreadSelector:@selector(launchTimer)to target:self with object:nil]添加注释吗;并执行[自启动计时器];只是为了测试的目的,这样我们就可以知道这是否是问题所在。是的,它的工作没有线程。。没问题。。不要撞车。。但应用程序正在变得越来越慢。。。这是因为nsrunlop也在主线程中运行。这就是为什么我在后台使用单独的线程来做这件事,它并不慢,但应用程序会崩溃。你不能从其他线程访问
UIWebView
,因为这就像玩俄罗斯轮盘赌。此外,您的计时器每次将触发两次,因为您创建了一个定时计时器(自动添加到运行循环中),然后又将其添加到运行循环中。您可能不得不面对这样一个事实,即没有足够的性能来实时捕获和呈现web视图。感谢您的提示。。。我这样做了,我一行一行地取消注释,我将很快用最新的更新问题