简体   繁体   中英

iOS background view not updated using NSTimer while scanning the bluetooth DEVICE

I am trying to work on getting the bluetooth scanning page to pair the BLE device using bluetooth. I have found the NSUInteger [ _ble.scannedPeripheral count ] do change while scanning. However, when it comes to the execution, the background view images and pages cannot even change. Would you please tell me other wayout make the page change if the variable showing available BLE devices changes from 0 to 1,2 or 3 ?

The below is my code : (Only relevant)

- (void)viewDidAppear:(BOOL)animated
{
    if (_ble)
    {
        _ble.delegate = (id) self;
        _ble.btStatus = BT_IDLE;
        [_ble startScanning];
    }

    [NSTimer scheduledTimerWithTimeInterval:0.2f  target:self selector:@selector(reloadData) userInfo:nil repeats:YES];

}


-(void) reloadData {


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // time consuming workout
            dispatch_async(dispatch_get_main_queue(), ^{
            // UI update workout for bluetooth scanning

            if( [ _ble.scannedPeripheral count ] > 0 ){
                [self stopAnimatingImages];
                [self setTapDemo :  [UIImage imageNamed:@"pairing_d.png"]  : @"Pairing"  : @"#C4CCCF"] ;
            }else{
                [self setTapDemo : [self loadingImage] : @"Pairing"  : @"#C4CCCF"] ;
                [self animateImages];
            }
        });
    });
}




- (void) setTapDemo: (UIImage *) cover  : (NSString *) title : (NSString *) colorHex{

    image = [UIImage imageNamed:@"shaded_cal.png"];
    imageA = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    _container = [[UIView alloc] initWithFrame:[self.view bounds]];
    [imageA setImage:cover];
    imageA.userInteractionEnabled = YES;
    UITapGestureRecognizer *myGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(touchesBegan:)];
    myGesture.numberOfTapsRequired = 1;
    myGesture.delegate=self;
    [imageA addGestureRecognizer:myGesture];
    [imageA setContentMode:UIViewContentModeScaleAspectFill];

    myLabelQ = [self constructLabelT:title:0.27:0.08: colorHex:25];
    myLabelBack =[self constructLabelT:@"BACK":0.04:0.01:@"#C4CCCF":18] ;
    if( bleCount > 0){

         for(NSUInteger  i = 0 ; i < [ _ble.scannedPeripheral count ] ; i ++){
            DevicePeriperal *device;
            NSString *uuid = [_ble.scannedPeripheralKey objectAtIndex:i];
             NSLog (@"device uuid = %@",  uuid);
             if (uuid)
             {
                 device = [_ble.scannedPeripheral objectForKey:uuid];
                 NSData * ssx = device.advertdata ;
                 device.rowIndex = i;
                 NSLog (@"device advert = %@",  ssx);
                 if([ssx length] > 0){
                     NSData *macD = [ssx subdataWithRange:NSMakeRange(0, 6)];
                     NSData *pairD = [ssx subdataWithRange:NSMakeRange(6, 1)];
                     NSString* newStr =  [self hexRepresentationWithSpaces:pairD : NO];
                     NSString* newMAC =  [self hexRepresentationWithSpaces:macD : YES];
                     NSLog (@"newStr = %@", newStr );
                     NSLog (@"newMAC = %@", newMAC );
                     _checkSumByte = [self calculateChecksum:newMAC];
                 }

                 NSLog (@"device = %@", device.uuid);
                 if (device )
                 {
                     UIImage *dImage = [UIImage imageNamed:@"device_u.png"];
                     float change =  0.15*i;
                     float yPosition = 0.25 + change ;
                     [imageA addSubview:[self deviceGet:dImage:device.deviceName: 0.40 : yPosition : @"#C4CCCF"]];
                 }
             }

         }
         //UIImage *dImage = [UIImage imageNamed:@"device_u.png"];
         //[imageA addSubview:[self deviceGet:dImage:@"x": 0.40 : 0.25 : @"#C4CCCF"]];
         //[imageA addSubview:[self deviceGet:dImage:@"x": 0.40 : 0.40 : @"#C4CCCF"]];
         //[imageA addSubview:[self deviceGet:dImage:@"x": 0.40 : 0.55 : @"#C4CCCF"]];
         //[imageA addSubview:myLabelS3];

         myLabelS1 = [self constructLabelT:@"SPOTTED":0.27:0.723: colorHex:25];
         myLabelS2 =[self constructLabelT:@"(choose the one you want to connect)":0.55:0.76:@"#C4CCCF":10] ;
         myLabelS3 = [self constructLabelT:@"devices":0.30:0.76: colorHex:25];

     }else{

         myLabelS1 = [self constructLabelT:@"SCANNING":0.27:0.723: colorHex:25];
         myLabelS2 =[self constructLabelT:@"devices":0.51:0.76:@"#C4CCCF":25] ;
         myLabelS3 = [self constructLabelT:@"for":0.30:0.76: colorHex:25];
     }

    [imageA addSubview:myLabelQ];
    [imageA addSubview:myLabelBack];

    [imageA addSubview:myLabelS1];
    [imageA addSubview:myLabelS2];

    [imageA addSubview:myLabelS3];
    [_container addSubview:imageA];

    [self.view addSubview:_container];
    [self.view sendSubviewToBack:_container];

}

Each time you call setTapDemo ::: , you will create a new _container view and it will be added to self.view . Because you never remove the old one from super view before initialise it again, self.view contains more and more subviews by timer repeats which will finally consume all memory then your app will crash.

Further, [self.view sendSubviewToBack:_container] was called each time while timer was fired, and you never remove your old _container , so any new _container would be hidden behind as result.

In conclusion, I guess you did create updated _container while [ _ble.scannedPeripheral count ] was changed but it was staying behind other subviews. So your may try to modify the code like this:

- (void) setTapDemo: (UIImage *) cover  : (NSString *) title : (NSString *) colorHex{

    // remove any old _container view
    if (_container) [_container removeFromSuperView];    

    image = [UIImage imageNamed:@"shaded_cal.png"];
    imageA = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    _container = [[UIView alloc] initWithFrame:[self.view bounds]];
    [imageA setImage:cover];
    imageA.userInteractionEnabled = YES;
    UITapGestureRecognizer *myGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(touchesBegan:)];
    myGesture.numberOfTapsRequired = 1;
    myGesture.delegate=self;
    [imageA addGestureRecognizer:myGesture];
    [imageA setContentMode:UIViewContentModeScaleAspectFill];

    myLabelQ = [self constructLabelT:title:0.27:0.08: colorHex:25];
    myLabelBack =[self constructLabelT:@"BACK":0.04:0.01:@"#C4CCCF":18] ;
    if( bleCount > 0){

         for(NSUInteger  i = 0 ; i < [ _ble.scannedPeripheral count ] ; i ++){
            DevicePeriperal *device;
            NSString *uuid = [_ble.scannedPeripheralKey objectAtIndex:i];
             NSLog (@"device uuid = %@",  uuid);
             if (uuid)
             {
                 device = [_ble.scannedPeripheral objectForKey:uuid];
                 NSData * ssx = device.advertdata ;
                 device.rowIndex = i;
                 NSLog (@"device advert = %@",  ssx);
                 if([ssx length] > 0){
                     NSData *macD = [ssx subdataWithRange:NSMakeRange(0, 6)];
                     NSData *pairD = [ssx subdataWithRange:NSMakeRange(6, 1)];
                     NSString* newStr =  [self hexRepresentationWithSpaces:pairD : NO];
                     NSString* newMAC =  [self hexRepresentationWithSpaces:macD : YES];
                     NSLog (@"newStr = %@", newStr );
                     NSLog (@"newMAC = %@", newMAC );
                     _checkSumByte = [self calculateChecksum:newMAC];
                 }

                 NSLog (@"device = %@", device.uuid);
                 if (device )
                 {
                     UIImage *dImage = [UIImage imageNamed:@"device_u.png"];
                     float change =  0.15*i;
                     float yPosition = 0.25 + change ;
                     [imageA addSubview:[self deviceGet:dImage:device.deviceName: 0.40 : yPosition : @"#C4CCCF"]];
                 }
             }

         }
         //UIImage *dImage = [UIImage imageNamed:@"device_u.png"];
         //[imageA addSubview:[self deviceGet:dImage:@"x": 0.40 : 0.25 : @"#C4CCCF"]];
         //[imageA addSubview:[self deviceGet:dImage:@"x": 0.40 : 0.40 : @"#C4CCCF"]];
         //[imageA addSubview:[self deviceGet:dImage:@"x": 0.40 : 0.55 : @"#C4CCCF"]];
         //[imageA addSubview:myLabelS3];

         myLabelS1 = [self constructLabelT:@"SPOTTED":0.27:0.723: colorHex:25];
         myLabelS2 =[self constructLabelT:@"(choose the one you want to connect)":0.55:0.76:@"#C4CCCF":10] ;
         myLabelS3 = [self constructLabelT:@"devices":0.30:0.76: colorHex:25];

     }else{

         myLabelS1 = [self constructLabelT:@"SCANNING":0.27:0.723: colorHex:25];
         myLabelS2 =[self constructLabelT:@"devices":0.51:0.76:@"#C4CCCF":25] ;
         myLabelS3 = [self constructLabelT:@"for":0.30:0.76: colorHex:25];
     }

    [imageA addSubview:myLabelQ];
    [imageA addSubview:myLabelBack];

    [imageA addSubview:myLabelS1];
    [imageA addSubview:myLabelS2];

    [imageA addSubview:myLabelS3];
    [_container addSubview:imageA];

    //[self.view addSubview:_container];
    //[self.view sendSubviewToBack:_container];
    // One line of code can do this trick

    [self.view insertSubview:_container atIndex:0];
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM