首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么添加到家庭中的场景(动作集)(HMHome)总是有更新的特性值(HMCharacteristic) :HomeKit

为什么添加到家庭中的场景(动作集)(HMHome)总是有更新的特性值(HMCharacteristic) :HomeKit
EN

Stack Overflow用户
提问于 2015-01-16 10:48:35
回答 1查看 976关注 0票数 2

我正在开发一个基于iOS API的演示HomeKit应用程序。

我已经创建了场景(动作集) AS1的特定家庭(H1)与一些服务(S1 S2.)在一次尝试中执行多个操作。我可以在没有任何问题的情况下创建多个场景,但是我在更新创建的场景时面临问题。

我的申请流程

  • 显示添加主页(ListView)
  • 点击任何家庭,细节屏幕出现很少的选项(附件A1,房间A2,场景A3.)
  • 点击A1添加附件(从这里可以改变附加附件的服务特性)
  • A3有一个添加场景(动作集)的列表,以及一个按钮来向当前的家庭添加新的场景(动作集)
  • 用户可以单击任何添加的场景(ActionSet)来更新其操作并同时命名两者。

问题:一旦我从附件A1选项中更改了服务的特性,添加到场景操作中的特征就会被更新为相同的值。

我的假设:i认为每个创建的场景(动作集)分别维护自己的特性的价值,如果用户从附件A1(来自其他地方)修改任何服务的特性,那么它不应该影响添加到保存场景的动作的价值(预条件-用户在创建场景的动作中选择了该附件)。

我的方法更新动作集(场景) as,

  • 一旦用户单击任何添加的操作集服务列表,用户就可以单击任何服务来更新其特性。
  • 当前操作集的访问操作
  • 访问特性的每个动作( HMCharacteristicWriteAction)访问服务的特性
  • 创建CustomServices实例(跟踪用户包含的其他信息,将服务包含到当前操作集中,等等)。并将其添加到数据源中,避免重复。
  • 一旦用户完成了对值的更改,然后单击update操作按钮
  • 启动更新过程

更新场景(动作集)

1.检查用户是否更改了Action的名称,

  • 然后,首先更新操作集的名称,一旦成功块执行删除所有已添加的操作(如果存在)。
  • 添加新的动作到更新的场景。

2.如果场景(动作集)名称与旧名称( )相同

  • 如果存在,请删除所有以前的操作。
  • 添加新的动作到更新的场景。

下面是用于填充服务listView的代码片段(准备数据源)

代码语言:javascript
复制
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)帮助我。如果我的方法是错误的,请随时指点我。

EN

回答 1

Stack Overflow用户

发布于 2015-05-19 06:10:26

场景可以用HMActionSet对象创建,

它只公开了3个apis,即updateName()、addAction()、removeAction()

如果用户想要更改场景名称,可以使用updateName。它不应该调用任何其他api ( removeAction或addAction)。

添加动作

addAction ()是通过使用附件的HMCharacteristic来改变任何附件使用场景的行为。该特性必须支持可以检查的WriteAction

代码语言:javascript
复制
[characteristic.properties containsObject:HMCharacteristicPropertyWritable]

如何加载特性

特性可以在Tableview中显示,也可以创建自定义视图。并且可以将该特征的值设置为显示视图。

如果当前的属性属性已经添加到actions启动中,那么我们需要从活动对象的actions属性中获取值。

代码语言:javascript
复制
- (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);
    });
}];

}

代码语言:javascript
复制
-(id) getTargetValueForCharacteristic:(HMCharacteristic *)characteristic {
id value;
for (HMCharacteristicWriteAction *action in self.actionSet.actions) {
    if ([action.characteristic isEqual:characteristic]) {
        value = action.targetValue;
    }
}
return value;
}

现在,在向场景添加特征或更新特征时,可以对这两个值进行设置。当它检查动作是否被添加到场景中时?然后它将从actionSet中获得价值。否则,它将读取该语法的当前值。

在添加场景或更新场景时保存场景相同。只需要加个条件。

代码语言:javascript
复制
/** 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,这是很好的。

问我你是否有任何疑问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27982281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档