Michal Zaborowski
Michal Zaborowski

Reputation: 5099

NSOperationQueue and sending delegate to main thread

Hi i have my class Sensors where i have gps,gyroscope,accelerometer and i want o send data in delegate from nsoperationqueue:

@protocol SensorsDelegate <NSObject>
@optional
- (void)motionManagerDidAccelerateData:(CMAccelerometerData *)accelerometerData;
@end


- (void)startAccelerometr
{
    if (motionManager.accelerometerAvailable) {

        self.motionManager.accelerometerUpdateInterval = 1.0/10.0;
        [self.motionManager startAccelerometerUpdatesToQueue:self.operationQueue 
          withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            if (error) {
                [motionManager stopAccelerometerUpdates];
            }
            else {
                [self.delegate motionManagerDidAccelerateData:accelerometerData];
            }
        }];
    }
}

How to send data to delegate which is in main thread ?? Or send acceleremoter data ?

Upvotes: 0

Views: 2551

Answers (4)

Raphael Ayres
Raphael Ayres

Reputation: 894

You can try:

Assuming that delegate is a property of type NSObject<SensorDelegate>* assigned at Sensor init method:

[self.delegate performSelectorOnMainThread:@selector(motionManagerDidAccelerateData:) withObject:accelerometerData waitUntilDone:NO];

Hope it helps.

Upvotes: 2

Inder Kumar Rathore
Inder Kumar Rathore

Reputation: 39988

Put onMainThread: method in the same class and change your code like this

- (void)startAccelerometr
{
        if (motionManager.accelerometerAvailable) {

        self.motionManager.accelerometerUpdateInterval = 1.0/10.0;
        [self.motionManager startAccelerometerUpdatesToQueue:self.operationQueue 
          withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            if (error) {
                [motionManager stopAccelerometerUpdates];
            }
            else {
                [self performSelectorOnMainThread:@selector(onMainThread:)
                  withObject:accelerometerData waitUntilDone:NO];
            }
        }];
    }
}

- (void)onMainThread:(id)accelerometerData{
    [self.delegate motionManagerDidAccelerateData:accelerometerData];
}

Upvotes: 2

DHamrick
DHamrick

Reputation: 8488

Change the queue you are sending the accelerometer updates to the main queue.

    [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {

Upvotes: 1

commanda
commanda

Reputation: 4881

Have you tried using

[self.delegate performSelectorOnMainThread:@selector(motionManagerDidAccelerateData:) withObject:accelerometerData waitUntilDone:NO];

Upvotes: 2

Related Questions