gpt4 book ai didi

iphone - 为什么 popToRootViewContoller 要么卡住要么需要很长时间才能执行?

转载 作者:行者123 更新时间:2023-12-03 20:45:18 24 4
gpt4 key购买 nike

我已经使用导航 Controller 设置了一些 View 。我希望在摇动手机时能够返回到原始 View 。首先,这是我的 AppDelegate 中的代码片段:

- (void)startAccelerometerUpdates
{

[motionManager startDeviceMotionUpdatesToQueue:queue withHandler:^(CMDeviceMotion *motion, NSError *error) {
// based from
// http://stackoverflow.com/questions/5214197/simple-iphone-motion-detect/5220796#5220796
float accelerationThreshold = 1; // or whatever is appropriate - play around with different values
CMAcceleration userAcceleration = motion.userAcceleration;
if (fabs(userAcceleration.x) > accelerationThreshold ||
fabs(userAcceleration.y) > accelerationThreshold ||
fabs(userAcceleration.z) > accelerationThreshold) {



if(!self->isRoot) {
NSLog(@"Stopping motion manager");
[motionManager stopDeviceMotionUpdates];
NSLog(@"popping to top view controller");
[navcon popToRootViewControllerAnimated:YES];
NSLog(@"Done popping");
}

}

}];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
.....

motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = .5;

isRoot = malloc(sizeof(BOOL));
self->isRoot = NO;
[self startAccelerometerUpdates];

[navcon pushViewController:main animated:NO];
....
}

我期待对 popToRoot 的调用会立即进行。不过,大约需要 30 秒。有趣的是,您可以按下顶部的按钮来手动返回上一页,此时该按钮不起作用。手机似乎做了很多工作来卡住按钮。所以,我在这里肯定做错了什么。

我认为也许我会多次调用 popToRootViewController,所以我添加了一个检查“isRoot”,正如您在代码中看到的那样(请不要分心为什么 BOOL 是一个指针,我这样做是有原因的)。

最佳答案

您的运动处理程序 block 似乎旨在在后台队列上运行。 UIKit 方法(如 popToRootViewController)只能在主线程上调用,并且当您未能遵循该规则时的行为通常与您所描述的类似。

-performSelectorOnMainThread:withObject:waitUntilDone 是确保 UIKit 代码在主线程上运行的最简单方法,但由于 -popToRootViewControllerAnimated: 采用非对象参数,需要多做一些工作。最简单的方法是添加另一个不带参数的方法:

-(void)popToRootView {
[navcon popToRootViewControllerAnimated:YES];
}

然后更新您的 block 以在主线程上调用该方法:

if(!self->isRoot) {
[motionManager stopDeviceMotionUpdates];
[self performSelectorOnMainThread:@selector(popToRootView) withObject:nil waitUntilDone:NO];
}

关于iphone - 为什么 popToRootViewContoller 要么卡住要么需要很长时间才能执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8388895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com