16

画像のデータを含む特性値があります。周辺機器では、次のように値を設定します。

_photoUUID = [CBUUID UUIDWithString:bPhotoCharacteristicUUID];
_photoCharacteristic = [[CBMutableCharacteristic alloc] initWithType:_photoUUID
                                                          properties:CBCharacteristicPropertyRead
                                                               value:Nil
                                                         permissions:CBAttributePermissionsReadable];

私の理解では、この値が要求didReceiveReadRequestされると、コールバックが呼び出されます。

-(void) peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request {

    if ([request.characteristic.UUID isEqual:_photoUUID]) {
        if (request.offset > request.characteristic.value.length) {
            [_peripheralManager respondToRequest:request withResult:CBATTErrorInvalidOffset];
            return;
        }
        else {
            // Get the photos
            if (request.offset == 0) {
                _photoData = [NSKeyedArchiver archivedDataWithRootObject:_myProfile.photosImmutable];
            }
        
            request.value = [_photoData subdataWithRange:NSMakeRange(request.offset, request.characteristic.value.length - request.offset)];
            [_peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];
        }
    }
}

これは、ほとんど Apple のドキュメントから来ています。コールバックの中央側にdidDiscoverCharacteristicは、次のコードがあります。

if ([characteristic.UUID isEqual:_photoUUID]) {
    _photoCharacteristic = characteristic;
    [peripheral readValueForCharacteristic:characteristic];
}

次に、didUpdateValueForCharacteristicコールバックを呼び出します。

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
    NSLog(@"updated value for characteristic");

    if ([characteristic.UUID isEqual:_photoUUID]) {
        NSArray * photos = [NSKeyedUnarchiver unarchiveObjectWithData:characteristic.value];
    }
}

すべてのコールバックが呼び出されますが、配列を再構築しようとすると、すべてのデータが正しく転送されないため配列が破損します。didRecieveReadRequest毎回異なるオフセットでコールバックが複数回呼び出されることを期待します。ただし、呼び出されるのは 1 回だけです。

私が間違っていることを誰かが知っているかどうか疑問に思っていましたか?

4

2 に答える 2