云套件订阅CKRecord创建

3
我正在使用Cloud Kit开发一个iOS应用程序。基本上,当删除CKRecord时,首先创建该CKRecord的人应该收到通知。为了实现这一点,我正在创建一个订阅。一切似乎都按照预期工作,但是似乎每当您创建记录时,实际上您就订阅了所有记录。然后,无论谁创建了记录,您都会收到通知。我认为我可能会在NSPredicate方面出错,也许有人可以帮忙吗?以下是相关代码:
    NSString *attributeName  = @"recordID";
    NSString *attributeValue = newRecord.recordID.recordName;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue];
    CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Photo" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordDeletion];

现在我明白,recordId属性名称实际上应该是类似recordID.recordName之类的东西,但我也尝试了这个方法,但它没有起作用。我仍然得到相同的结果。我不知道最好的方法是什么,但基本上我想要的是当CKRecord被删除时,订阅只会触发对CKRecord创建者。

请注意,首先我创建CKRecord,然后将其上传到CloudKit。然后在回调方法中,我进行订阅并执行上述代码。

1个回答

2

当您查询recordID字段时,attributeValue应该是一个recordID而不是字符串。对于attributeName过滤器,您不应该使用%@,而应该使用%K。

    NSString *attributeName  = @"recordID";
    CKRecordID *attributeValue = [[CKRecordID alloc] initWithName:newRecord.recordID.recordName];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", attributeName, attributeValue];
    CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Photo" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordDeletion];

但是,如果您的逻辑像这样,那么您将为每个创建的记录创建一个订阅。您可以通过一个通用订阅来解决此问题。只需添加一个条件,即metadata字段creatorUserRecordID。然后,您需要首先获取登录的iCloud帐户的recordID,然后像这样创建订阅: 在容器上执行fetchUserRecordIDWithCompletionHandler。在回调中,您将收到一个recordID。只需使用它来创建过滤器。
    [[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
            NSString *attributeName  = @"creatorUserRecordID";
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", attributeName, recordID];
           CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Photo" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordDeletion];
           // ... rest of your code
        }]

只需通过错误处理扩展此代码即可。


嗨Edwin,我刚刚尝试了你的第一个解决方案,但似乎我仍然订阅了所有内容...我在两个不同的iPhone上使用了两个不同的iTunes/iCloud账户进行记录。在每个手机上上传了不同的记录。当其中一个手机删除了两个记录时,另一个手机都收到了通知。我想尝试你的第二种方法,但我想知道为什么第一种方法不起作用? - Kjell Connelly
我也尝试过:NSString *attributeName = @"recordID"; CKRecordID *attributeValue = newRecord.recordID; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue]; 但它没有起作用。 - Kjell Connelly
我还注意到在CloudKit仪表板上,当我转到订阅类型时,我只看到一个记录类型为“照片”,触发器为“删除”,条件为“(空白)”的订阅... 我以为每个在那里创建的记录都会有一个订阅,并且记录ID的条件必须是一些长字符串? - Kjell Connelly
嗨,Edwin,我刚刚尝试了你的第二个解决方案,现在当我尝试订阅时出现错误:意外表达式:creatorUserRecordID LIKE <CKRecordID: 0x15c755580; _60078334fb8fe8f5ab957cf492dfbf3a:(_defaultZone:__defaultOwner__)>。 - Kjell Connelly
啊!我怎么会忽略了它。谓词正在使用 like。对于 CKRecordID 查询,应该使用 ==,因为它总是精确匹配。我已经纠正了这个答案。 - Edwin Vermeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接