1

locationManager:didUpdateHeading:メソッドによって返される継続的に更新される値をaglobal intまたはaのいずれかに格納しproperty intて、MotionHandlerクラスの他の関数がそれを使用できるようにします。ただし、このデリゲートメソッドは、その値をグローバルに保存することはできず、ローカルにしか保存できないようです。何故ですか?それは実際の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 ?
}

TheViewController.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 に答える