0

アプリのメイン スレッドで初期化するオブジェクトがありますが、そのメソッドの 1 つをバックグラウンド スレッドで呼び出しますperformSelectorInBakground。ただし、メソッドは応答しないようです。すなわち :

AccHandler.m

#import "AccHandler.h"

@implementation AccHandler
@synthesize accelerationOnYaxis;
-(void)startAccelerationUpdates
{
    CMMotionManager *motionManager = [[CMMotionManager alloc] init];
    motionManager.deviceMotionUpdateInterval = 0.01; 
    [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                       withHandler:^(CMDeviceMotion *motion, NSError *error)
     {
         self.accelerationOnYaxis = motion.userAcceleration.y;
     }
     ];
}
@end

Tester.m

#import "Tester.h"

@interface Tester()
{
   AccHandler *accHandler;
}
@end

@implementation Tester
- (id) init
{
    //....
    accHandler = [[AccHandler alloc] init]; // initialized in main thread
}

-(void)test
{
    [accHandler startAccelerationUpdates]; // but -(void)test will be executed in a background thread..
    NSLog(@"current acceleration is %f", accHandler.accelerationOnYaxis;
}

後で私のコードでtestメソッドを a から呼び出しますが、performSelectorInBackground加速度値が 0 になります..

4

1 に答える 1

2

1 つのオブジェクトをメイン スレッドで初期化し、そのメソッドを別のスレッドで実行できますか?

はい。

あなたの間違いは、バックグラウンドで結果が生成されるのを待っていないことのようです。

別の問題はmotionManager、強い参照によって保持されていないように見えることです。そのため、初期化後すぐに消える可能性があります。

于 2012-08-20T19:31:38.087 に答える