为什么 UISlider 更新 Cocoa-Touch 中的值很慢?

Why the UISlider is slow to update the value in Cocoa-Touch?

我正在 Objective-C 和 IOS8 开发 BLE

我有两个文件名为 BLEConnect.mBTServer.mBLEConnect.m.

中有UILabelUISlider

BLEConnect.m使用BTServer.m获取数据,经过BTServer.m有接收数据,会发送数据给BLEConnect.m.

运行过程

1. 调用 [self.defaultBTServer readValue:chara]; in BLEConnect.m 点击按钮(SyncLEDState)

2. 当函数readValue被调用时,自动反馈函数didUpdateValueForCharacteristic会反馈数据。并且它将数据发送到 BLEConnect.m

中的函数 updateLEDstate

3.当函数updateLEDstateBLEConnect.m 已经从 BTServer.m 获取数据,它会将值更新为 UISlider.

BTServer.m很好地获取了数据,它也将数据发送给了BLEConnect.m

但是我在BLEConnect.mupdateLEDstate里看到了日志。 NSLog(@"updateLEDstate end!!"); 已经显示,我确信数据是正确的。但是UISlider更新很慢...

偏相关代码如下:

BLEConnect.m

    #import "BLEConnect.h"
    #import "BTServer.h"
    #import "ProgressHUD.h"
    #import <QuartzCore/QuartzCore.h>

        @interface BLEConnect () <BTServerDelegate>
         @property (strong,nonatomic) BTServer *defaultBTServer;
        @end

        - (void)viewDidLoad
        {
            [super viewDidLoad];
            self.defaultBTServer = [BTServer defaultBTServer];
            self.defaultBTServer.delegate=(id)self;
            [self.defaultBTServer initBLEConnect:self];

            [self.WhiteSlider setMinimumValue:0];
            [self.WhiteSlider setMaximumValue:100];
            self.WhiteSlider.value = 100;
        }


        - (IBAction)SyncLEDState:(id)sender {

            for(CBCharacteristic *chara in self.defaultBTServer.discoveredSevice.characteristics){      
                if ([chara.UUID isEqual:[CBUUID UUIDWithString:LEDStateCharacteristicUUID]]) {

                 //call the function readValue in BTServer.m
                 [self.defaultBTServer readValue:chara];
                }
            }
        }

        - (void)updateLEDstate:(NSMutableArray*)LEDstate
        {
            // get the data from BTServer.m , and update the value.
            //But it is slow to change the value......
            self.RedSlider.value = [[LEDstate objectAtIndex:0] floatValue];
            NSLog(@"updateLEDstate end!!");
        }

BTServer.h

#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>
#import "PeriperalInfo.h"
#import "BLEConnect.h"

@class BLEConnect;

+(BTServer*)defaultBTServer;
-(void)initBLEConnect:(BLEConnect *) BLEconnect;

BTServer.m

#import "BTServer.h"
#import "BLEConnect.h"

+(BTServer*)defaultBTServer
{
    if (nil == _defaultBTServer) {
        _defaultBTServer = [[BTServer alloc]init];
        [_defaultBTServer initBLE];
    }
    return _defaultBTServer;
}

-(void)initBLEConnect:(BLEConnect *)BLEconnect
{   //receive the BLEConnect class object.
    self.defaultBLEConnect = BLEconnect;
}

-(void)readValue:(CBCharacteristic*)characteristic
{
    [self.selectPeripheral readValueForCharacteristic:self.selectCharacteristic];

    /*!!!!When this function been call , the feedback function didUpdateValueForCharacteristic will be call. The data is get by characteristic.value . */
}

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    NSString *LEDstate = [self getHEX:characteristic.value];

    //get the data and put into NSMutableArray.
    NSMutableArray * LEDstateArray = [[NSMutableArray alloc] initWithObjects:nil];
   [LEDstateArray addObject:[NSNumber numberWithInt:LEDstate]];

    //send the NSMutableArray to updateLEDstate function in BLEConnect.m
    [self.defaultBLEConnect updateLEDstate:LEDstateArray];
}

为什么UISlider更新Objective-c中的值很慢?

提前致谢。

peripheral:didUpdateValueForCharacteristic: 和相关方法不保证在主队列上回调。但是,您始终必须在主线程上更新 UI。

使用 dispatch_async 在主队列上调度您的 UISlider 代码。