Question

OK the code is now working, but it still needs work. The values I get are "sticky", they are not stable (the magnetic North seems to move a bit every time I try to return to it), and I need to shake the device a bit in order to refresh/wake-up the values..

Game.h

#import <Foundation/Foundation.h>

#import "CoreLocation.h"

@interface Game : NSObject

<CLLocationManagerDelegate>

@property BOOL stopButtonPressed;

-(void) play;

@end

Game.m

@implementation Game

- (id) init 
{
    self = [super init];

    self.stopButtonPressed = NO;

    CLLocationManager *locationManager;

    locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;

    return self;
}

-(void) play 
{

    [locationManager startUpdatingHeading]; 

    while(!self.stopButtonPressed)
    {
         double degrees = locationManager.heading.magneticHeading;

         int degreesRounded = (int)degrees;

         NSLog(@"Degrees : %i", degreesRounded);
    }
}

@end

MyViewController.m

@interface MyViewController()
{
    Game *game;
}
@end

@implementation MyViewController

-(void) viewDidLoad
{
    game = [[Game alloc] init];
}

- (IBAction)playPressed:(UIButton *)sender 
{
    [game performSelectorInBackground:@selector(play) withObject:nil];
}

- (IBAction)stopPressed:(UIButton *)sender 
{
    game.stopButtonPressed = YES;
}

@end

What am I doing wrong?

Was it helpful?

Solution

This code will block the thread, and if it's happening in the main thread, you will never get the button press.

CLLocationManager is an asynchronous mechanism. To work with it properly, you must provide a delegate which it will notify when updates to location are available (this can be self in most cases (where self is a viewController or similar). See CLLocationManagerDelegate docs

...
    CLLocationManager *locationManager;
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    [locationManager startUpdatingHeading];
}

- (void)locationManager:manager didUpdateHeading:newHeading {
    double degrees = newHeading.magneticHeading;
     NSLog(@"Degrees : %F", degrees);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top