1

我想将locationManager:didUpdateHeading:方法​​返回的不断更新的值存储在 aglobal int或 aproperty int中,以便 MotionHandler 类的其他函数可以使用它。但是,此委托方法似乎无法在全局范围内存储其值,而只能在本地存储。这是为什么?是因为它不是实际的 MotionHandler 方法吗?我该如何解决这个问题?谢谢您的帮助。

运动处理器.m

#import "MotionHandler.h"

@interface MotionHandler()
{
    CLLocationManager *locationManager;
    int degrees; // the global in question..
}
@end

@implementation MotionHandler

-(void) startCompassUpdates
{
    locationManager =[[CLLocationManager alloc] init];
    locationManager.delegate=self;
    [locationManager startUpdatingHeading];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    // This is working, a new value is stored in "degrees" & logged on the console after each update. However it only seems to be updating "degrees" locally..
    degrees = (int)locationManager.heading.magneticHeading;
    NSLog(@"from delegate method: %i", degrees); 
}

-(int) showDegrees
{
    return degrees; //  This is not working. Whenever I call this method, "degrees" is always zero. Why isn't this global being updated by the previous method ?
}

视图控制器.m

//...

- (void)viewDidLoad
{
    [super viewDidLoad];

    currentMotionHandler = [[MotionHandler alloc] init];

    [currentMotionHandler startCompassUpdates];

    while(1==1)
    {
        NSLog(@"from showDegrees method: %i",[currentMotionHandler showDegrees]); // this just keeps returning zero..
    }
}
//...
4

1 回答 1

0

根据 OP 要求,我已将我的评论转移到一个答案

您需要停止使用while循环来获得不断变化的值的反馈。由于 Cocoa Touch 是一个基于事件的系统,因此您无法通过以这种方式创建无限循环来劫持其运行循环。即使在基于事件的系统之外,使用如此紧密的循环也会损害性能并且几乎没有收益。

如果您想要连续更新(或看起来是连续的),您可以:

  1. 使用计时器每X毫秒调用一次方法(请参阅Apple 指南)。
  2. 使用后台线程(请参阅Apple 指南)。

我更喜欢使用计时器方法,因为它的开销最低,并且在与 UI 的其余部分相同的线程中运行该方法,从而避免任何可能的线程问题。

于 2012-08-20T10:29:14.313 回答