Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.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
iOS:设备在运行密集型计算任务时挂起_Ios_Load_Cpu_Sleep - Fatal编程技术网

iOS:设备在运行密集型计算任务时挂起

iOS:设备在运行密集型计算任务时挂起,ios,load,cpu,sleep,Ios,Load,Cpu,Sleep,我设计了一个应用程序,它有时需要进行密集计算(在一个循环中),在十分之几秒的时间内大量加载cpu。我启动一个UIAlertView来显示一条消息,比如:“请稍等几秒钟”。 我的问题是,在这段时间内,应用程序根本没有响应,用户也不能拒绝UIAlertView本身。这不是一个大问题,但对用户来说不公平。但如果我要实现某种取消按钮,这可能会成为一个真正的问题。 我怎样才能解决这个问题?例如,当检测到过多的cpu负载时,我是否可以在计算循环中使用一些sleep命令? 谢谢。您不应该在主线程上执行CPU密

我设计了一个应用程序,它有时需要进行密集计算(在一个循环中),在十分之几秒的时间内大量加载cpu。我启动一个UIAlertView来显示一条消息,比如:“请稍等几秒钟”。 我的问题是,在这段时间内,应用程序根本没有响应,用户也不能拒绝UIAlertView本身。这不是一个大问题,但对用户来说不公平。但如果我要实现某种取消按钮,这可能会成为一个真正的问题。 我怎样才能解决这个问题?例如,当检测到过多的cpu负载时,我是否可以在计算循环中使用一些sleep命令?
谢谢。

您不应该在主线程上执行CPU密集型操作,因为这会影响应用程序的响应能力,正如您所看到的。您可以使用队列在另一个线程上执行任务

我链接到的《苹果指南》中有更多的细节,但一般来说,你可以使用以下内容-

dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(aQueue, ^{
    [self performIntensiveTask];
});
如有必要,您可能需要知道密集任务何时完成。您可以使用
NSNotification
来执行此操作,也可以只更新UI元素-如果选择第二个,请注意您应该只更新主线程上的UI元素,以便-

dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(aQueue, ^{
    [self performIntensiveTask];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self updateUI];
    });
});

这对我有用。一个结果是,我现在必须阻止用户启动其他任务,等待这个任务完成,但这是一个小问题。因此,我对答案完全满意。谢谢你