为什么 UISlider 更新 Cocoa-Touch 中的值很慢?
Why the UISlider is slow to update the value in Cocoa-Touch?
我正在 Objective-C
和 IOS8 开发 BLE
。
我有两个文件名为 BLEConnect.m
和 BTServer.m
。 BLEConnect.m
.
中有UILabel
和UISlider
BLEConnect.m
使用BTServer.m
获取数据,经过BTServer.m
有接收数据,会发送数据给BLEConnect.m
.
运行过程
1. 调用 [self.defaultBTServer readValue:chara];
in BLEConnect.m
点击按钮(SyncLEDState
)
2. 当函数readValue
被调用时,自动反馈函数didUpdateValueForCharacteristic
会反馈数据。并且它将数据发送到 BLEConnect.m
中的函数 updateLEDstate
3.当函数updateLEDstate
在BLEConnect.m
已经从 BTServer.m
获取数据,它会将值更新为 UISlider
.
BTServer.m
很好地获取了数据,它也将数据发送给了BLEConnect.m
。
但是我在BLEConnect.m
updateLEDstate
里看到了日志。 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
代码。
我正在 Objective-C
和 IOS8 开发 BLE
。
我有两个文件名为 BLEConnect.m
和 BTServer.m
。 BLEConnect.m
.
UILabel
和UISlider
BLEConnect.m
使用BTServer.m
获取数据,经过BTServer.m
有接收数据,会发送数据给BLEConnect.m
.
运行过程
1. 调用 [self.defaultBTServer readValue:chara];
in BLEConnect.m
点击按钮(SyncLEDState
)
2. 当函数readValue
被调用时,自动反馈函数didUpdateValueForCharacteristic
会反馈数据。并且它将数据发送到 BLEConnect.m
updateLEDstate
3.当函数updateLEDstate
在BLEConnect.m
已经从 BTServer.m
获取数据,它会将值更新为 UISlider
.
BTServer.m
很好地获取了数据,它也将数据发送给了BLEConnect.m
。
但是我在BLEConnect.m
updateLEDstate
里看到了日志。 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
代码。