可以在主线程中初始化一个对象,并在单独的线程中执行其方法吗?

时间:2012-08-20 19:24:51

标签: objective-c ios multithreading

我有一个对象,我在应用程序的主线程中初始化,但我使用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调用performSelectorInBackground方法,但我得到0个加速度值..

1 个答案:

答案 0 :(得分:2)

  

可以在主线程中初始化一个对象并使用其方法   在一个单独的线程中执行?

你的错误似乎是你不是在等待背景材料产生结果。

另一个问题可能是某些强引用似乎没有保留motionManager。所以它可能会在初始化后立即消失。