我正在开发一个基于iOS API的演示HomeKit应用程序。
我已经创建了场景(动作集) AS1的特定家庭(H1)与一些服务(S1 S2.)在一次尝试中执行多个操作。我可以在没有任何问题的情况下创建多个场景,但是我在更新创建的场景时面临问题。
我的申请流程
问题:一旦我从附件A1选项中更改了服务的特性,添加到场景操作中的特征就会被更新为相同的值。
我的假设:i认为每个创建的场景(动作集)分别维护自己的特性的价值,如果用户从附件A1(来自其他地方)修改任何服务的特性,那么它不应该影响添加到保存场景的动作的价值(预条件-用户在创建场景的动作中选择了该附件)。
我的方法更新动作集(场景) as,
更新场景(动作集)
1.检查用户是否更改了Action的名称,
2.如果场景(动作集)名称与旧名称( )相同
下面是用于填充服务listView的代码片段(准备数据源)
func prepareDataSource(){
var actionsArray = NSArray(array:
self.currentScene!.actions.allObjects)
for (var index = 0 ; index<actionsArray.count; index++ ){
var sWritttenAction:HMCharacteristicWriteAction? = actionsArray[index] as? HMCharacteristicWriteAction
if let sActionCharacteristic = sWritttenAction!.characteristic{
var accessoryService = sActionCharacteristic.service as HMService
if(!isServiceAlraedyAdded(accessoryService.name)){
var sceneService = DMIAccessoryService.initWithService(accessoryService)
sceneService.isSelected = true
//Add Services
self.services.append(sceneService)
self.addedServices.append(sceneService)
println("its a diffrent service")
}
else
{
println("Already has the same service")
}
}
}
}我已经看过HomeKit文档很多次了,但是没有发现任何与这个问题有关的东西。
就我所理解的动作集的概念而言,它应该分别保持特征值,以便以后我们可以更改它的操作值。
从过去的几天(因为几天前在这里发布了同样的问题)开始,我就一直面临这个问题,现在我确信这是苹果家庭api中的一个缺陷,因为一旦我尝试重新执行相同的操作集(预条件:用户从A1选项更改服务特性的值),.It就会成功执行,并更新所有具有类似于已创建场景(ActionSet)特性的附件。
请任何人谁发现类似的问题更新现场(ActionSet)帮助我。如果我的方法是错误的,请随时指点我。
发布于 2015-05-19 06:10:26
场景可以用HMActionSet对象创建,
它只公开了3个apis,即updateName()、addAction()、removeAction()
如果用户想要更改场景名称,可以使用updateName。它不应该调用任何其他api ( removeAction或addAction)。
添加动作
addAction ()是通过使用附件的HMCharacteristic来改变任何附件使用场景的行为。该特性必须支持可以检查的WriteAction。
[characteristic.properties containsObject:HMCharacteristicPropertyWritable]如何加载特性
特性可以在Tableview中显示,也可以创建自定义视图。并且可以将该特征的值设置为显示视图。
如果当前的属性属性已经添加到actions启动中,那么我们需要从活动对象的actions属性中获取值。
- (void) readValueForCharacteristic:(HMCharacteristic *)characteristic completion:(void (^)(id, NSError *))completion {
for (HMCharacteristicWriteAction *action in self.actionSet.actions) {
if ([characteristic isEqual:action.characteristic]) {
completion([self getTargetValueForCharacteristic:characteristic],nil);
return;
}
}
[characteristic readValueWithCompletionHandler:^(NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
completion(characteristic.value, error);
});
}];}
-(id) getTargetValueForCharacteristic:(HMCharacteristic *)characteristic {
id value;
for (HMCharacteristicWriteAction *action in self.actionSet.actions) {
if ([action.characteristic isEqual:characteristic]) {
value = action.targetValue;
}
}
return value;
}现在,在向场景添加特征或更新特征时,可以对这两个值进行设置。当它检查动作是否被添加到场景中时?然后它将从actionSet中获得价值。否则,它将读取该语法的当前值。
在添加场景或更新场景时保存场景相同。只需要加个条件。
/** Create property */
@property (nonatomic) dispatch_group_t sceneGroup;
@property (nonatomic) NSError *error;
/** Initialize */
self.sceneGroup = dispatch_group_create();
- (void)saveActionSetWithName:(NSString *)name
completionHandler:(void (^)(NSError *error))completion {
if (self.actionSet) {
[self saveScene:self.actionSet];
[self updateNameIfRequire:name];
} else {
[self createScene:name];
}
dispatch_group_notify(self.sceneGroup, dispatch_get_main_queue(), ^{
completion(self.error);
self.error = nil;
});
}如果场景已经创建,那么在saveScene: method中将可写的操作添加到actions中。还要检查场景名称是否被更改,如果需要,只需使用updateName: method更改名称即可。
如果未创建场景,则使用HMHome类的方法addActionSetWithName创建场景:通过使用home对象,在其完成块上调用saveScene方法,并在其中向创建的场景添加可写操作。
你可以参考苹果的HMCatalog样本项目。
如果您创建模型自定义类来管理Actionset,这是很好的。
问我你是否有任何疑问。
https://stackoverflow.com/questions/27982281
复制相似问题