2016-12-15 13 views
0

Objective-Cのブロックを扱う際に問題があります。私の問題は、関数readDataFromCharactUUIDの完了ブロックはdo-while-loopを使用して呼び出されないということです。 do-while-loopを使用せずに、それは一度呼び出されます。objective-cのブロックとdo-whileループ

私のコードでしたいことは、値が0x01であるようにBLE特性から値を頻繁に読み取ることです。

私の質問:なぜ完了ブロックは実行されませんでしたか?私の場合、完成ブロックが実行されていると私は何をすることができますか?

使用されるコード:

static bool dataReady = false; 

-(IBAction)Buttonstartpressed:(UIButton *)sender{ 

LGLog(@"start pressed"); 

NSData *data = [NSData dataWithBytes:(unsigned char[]){CMD_Control_Learn} length:1]; 
[LGUtils writeData :data 
     charactUUID :CHARACTERISTIC_UUID_REMOTEBUDDYControl 
     serviceUUID :SERVICE_UUID_REMOTEBUDDY 
     peripheral :_mBuddy completion:^(NSError *error) 
     { 
      // Befehl wurde übermittelt 
      NSLog(@"Einlernen gesendet => Error : %@", error); 

      do 
      { 
       // RB_Notification Data Ready auslesen 
       [LGUtils readDataFromCharactUUID:CHARACTERISTIC_UUID_REMOTEBUDDYNotification 
            serviceUUID:SERVICE_UUID_REMOTEBUDDY 
             peripheral:_mBuddy 
             completion:^(NSData *data, NSError *error) 
       { 

        NSLog(@"Data : %@ Error : %@", data, error); 


        const uint8_t *bytes = [data bytes]; // pointer to the bytes in data 
        int data_int = bytes[0]; // first byte 

        switch(data_int) 
        { 
         case 0x01: 
          NSLog(@"Data ready!"); 
          dataReady = true; 
          break; 
         case 0x02: 
          NSLog(@"Data Transimission Error!"); 
          break; 
         case 0x00: 
          NSLog(@"No Notification! => check again"); 
          break; 
         default: 
          break; 
        } 
       } 
       ]; 
      } 
      while(!dataReady); 

     }];} 

は、事前にありがとうございます!

+0

どれ運これで? – Miknash

答えて

0

実行ブロックは非同期です。つまり、別のスレッドで実行されます。私は周辺機器から読み込むための関数を作成し、読み込んだ後、結果は0x01であり、別の関数を呼び出す、そうでなければその関数を再帰で呼び出す。

(コンパイル約100%がわからない - ではないマックで今)このような何か:

NSData *data = [NSData dataWithBytes:(unsigned char[]){CMD_Control_Learn} length:1]; 
[LGUtils writeData :data 
     charactUUID :CHARACTERISTIC_UUID_REMOTEBUDDYControl 
     serviceUUID :SERVICE_UUID_REMOTEBUDDY 
    peripheral :_mBuddy completion:^(NSError *error) 
    { 
     // Befehl wurde übermittelt 
     NSLog(@"Einlernen gesendet => Error : %@", error); 
     // RB_Notification Data Ready auslesen 
     [self checkForStatus:CHARACTERISTIC_UUID_REMOTEBUDDYNotification andServiceUUID: SERVICE_UUID_REMOTEBUDDY andPeripheral:_mBuddy]; 
}]; 
} 

-(void) checkForStatus:(NSString*)characteristic andServiceUUID:(NSString*) service andPeripheral:(CBPeripheral*) _mBuddy{ 
    [LGUtils readDataFromCharactUUID:CHARACTERISTIC_UUID_REMOTEBUDDYNotification 
          serviceUUID:SERVICE_UUID_REMOTEBUDDY 
           peripheral:_mBuddy 
           completion:^(NSData *data, NSError *error) 
     { 

      NSLog(@"Data : %@ Error : %@", data, error); 


      const uint8_t *bytes = [data bytes]; // pointer to the bytes in data 
      int data_int = bytes[0]; // first byte 

      switch(data_int) 
      { 
       case 0x01: 
        NSLog(@"Data ready!"); 
        [self dataReady]; // some of yours functions 

        break; 
       case 0x02: 
        [self checkForStatus:CHARACTERISTIC_UUID_REMOTEBUDDYNotification andServiceUUID: SERVICE_UUID_REMOTEBUDDY andPeripheral:_mBuddy]; 
        break; 
       case 0x00: 
        [self checkForStatus:CHARACTERISTIC_UUID_REMOTEBUDDYNotification andServiceUUID: SERVICE_UUID_REMOTEBUDDY andPeripheral:_mBuddy]; 
        break; 
       default: 
        break; 
      } 
     } 
    ]; 

} 
+0

ありがとうございます! –

関連する問題