Q1:メソッドを呼び出して、現在メインスレッドで実行されている別のメソッドの内部からバックグラウンドスレッドで実行させることはできますか?
Q2:上記の拡張として、メソッドを呼び出して、他のバックグラウンドスレッド自体で現在実行されている別のメソッドの内部からバックグラウンドスレッドで実行させることはできますか?
Q3:そして上記の最後の質問です:あるスレッド(メイン/バックグラウンド)であるオブジェクトXのインスタンスを初期化し、そのオブジェクトXのメソッドYを他のバックグラウンドスレッドで実行すると、このメソッドYは可能になりますメッセージを送信して更新しますint property
(たとえば、そのオブジェクトX、またはそのような通信は不可能ですか?
私がこの最後の質問をしている理由は、私が何度も何度もそれを繰り返してきて、ここで何が悪いのか理解できないからです。
次のコードは、ゼロ加速度とゼロ度の値を返します。
MotionHandler.m
@implementation MotionHandler
@synthesize currentAccelerationOnYaxis; // this is a double
-(void)startCompassUpdates
{
locationManager=[[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.delegate=self;
[locationManager startUpdatingHeading];
NSLog(@"compass updates initialized");
}
-(int) currentDegrees
{
return (int)locationManager.heading.magneticHeading;
}
-(void) startAccelerationUpdates
{
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 0.01;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:^(CMDeviceMotion *motion, NSError *error)
{
self.currentAccelerationOnYaxis = motion.userAcceleration.y;
}
];
}
@end
Tester.m
@implementation Tester
-(void)test
{
MotionHandler *currentMotionHandler = [[MotionHandler alloc] init];
[currentMotionHandler performSelectorInBackground:@selector(startCompassUpdates) withObject:nil];
[currentMotionHandler performSelectorInBackground:@selector(startAccelerationUpdates) withObject:nil];
while(1==1)
{
NSLog(@"current acceleration is %f", currentMotionHandler.currentAccelerationOnYaxis);
NSLog(@"current degrees are %i", [currentMotionHandler currentDegrees]);
}
SomeViewController.m
@implementation SomeViewController
-(void) viewDidLoad
{
[myTester performSelectorInBackground:@selector(test) withObject:nil];
}
@end
ただし、次のコードは通常、これらの値を返します。
Tester.m
@interface Tester()
{
CLLocationManager *locationManager;
double accelerationOnYaxis;
// more code..
}
@end
@implementation Tester
- (id) init
{
locationManager=[[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.delegate=self;
[locationManager startUpdatingHeading];
// more code..
}
-(void) test
{
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 0.01;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMDeviceMotion *motion, NSError *error)
{
accelerationOnYaxis = motion.userAcceleration.y;
}
];
while(1==1)
{
NSLog(@"current acceleration is %f", accelerationOnYaxis);
NSLog(@"current degrees are %i", locationManager.heading.magneticHeading);
}
}
SomeViewController.m
@implementation SomeViewController
-(void) viewDidLoad
{
[myTester performSelectorInBackground:@selector(test) withObject:nil];
}
最初のバージョンの何が問題になっていますか?デザイン的にはずっと良いように見えるので、私は本当に最初のものを使いたいです。助けてくれてありがとう!