0

ここに新しい iOS 開発者がいます。ブロックと高度計に関するドキュメントでこれに対する答えを探していましたが、不足しています。欠けている簡単なものがあると思いますが、それを理解できません。

PressureSensor というカスタム クラスがあります。簡単に言えば、クラスには次のプロパティがあります。

@property (nonatomic, strong, readwrite) NSMutableArray *pressure;

高度計からこの配列に NSNumber 値を読み込みます。

クラスの初期化子は次のとおりです。

- (instancetype)init
{
    self = [super init];

    if (self)
    {
        if (self.altimeterIsAvailable)
        {
            NSOperationQueue *queue = [[NSOperationQueue alloc] init];
            [self.altimeter startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
                dispatch_async(dispatch_get_main_queue(), ^ {

                    [self.pressure addObject:altitudeData.pressure];

                    NSLog(@"Pressure 1: %@", [self.pressure lastObject]);
                });
            }];
            NSLog(@"Pressure 2: %@", [self.pressure lastObject]);
        }
    }
    return self;
}

携帯電話でアプリを実行すると、self.pressure の lastObject にアクセスする「Pressure 1」行によって圧力がコンソールに出力されるため、圧力が正常に self.pressure 配列に追加されたと想定します。ただし、Pressure 2 ラインがコンソールに (null) を出力するため、これらの変更はこのブロックの外では保持されないようで、このブロックの外で self.pressure を使用して何もできないようです。

ブロックが正確にどのように機能するかについて何か不足していますか? どこかに__blockが必要ですか?私はここで完全に途方に暮れています。

補遺: self.altimeterIsAvailable は別の場所で定義されています。コードのその部分に問題はないはずです。

編集:エラーは別の場所にありました。この投稿を閲覧する将来の読者のために、上記のコードは、ブロック内のプロパティ配列に追加するための完全に有効な方法である必要があります。

4

1 に答える 1

0

これは答えではありませんが、言及したいと思います。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[self.altimeter startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^ {
        ...
    });
 }];

キューを作成し、メイン キューに dispatch_async します。冗長です。NSOperationQueue +mainQueue メソッドを直接使用できます。

NSOperationQueue *queue = [NSOperationQueue mainQueue];
[self.altimeter startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
    ...
}];
于 2014-12-23T19:24:51.807 に答える