画像のデータを含む特性値があります。周辺機器では、次のように値を設定します。
_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 回だけです。
私が間違っていることを誰かが知っているかどうか疑問に思っていましたか?