简体   繁体   English

扫描蓝牙设备时未使用NSTimer更新iOS背景视图

[英]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. 我正在尝试获取蓝牙扫描页面以使用蓝牙配对BLE设备。 I have found the NSUInteger [ _ble.scannedPeripheral count ] do change while scanning. 我发现NSUInteger [ _ble.scannedPeripheral count ]在扫描时确实发生了变化。 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 ? 如果显示可用BLE设备的变量从0更改为1,2或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 . 每次调用setTapDemo ::: ,都将创建一个新的_container视图,并将其添加到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. 因为您从未在超级视图中删除旧视图,然后再对其进行初始化,所以self.view包含越来越多的子视图(通过计时器重复),这些子视图最终会消耗所有内存,然后您的应用程序将崩溃。

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. 此外,每次在触发计时器时都会调用[self.view sendSubviewToBack:_container] ,并且您永远不会删除旧的_container ,因此任何新的_container都将被隐藏在后面。

In conclusion, I guess you did create updated _container while [ _ble.scannedPeripheral count ] was changed but it was staying behind other subviews. 总之,我想您在[ _ble.scannedPeripheral count ]更改时确实创建了更新的_container ,但它仍位于其他子视图的后面。 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];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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