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 的attributeName 实际上应该是recordID.recordName 之类的东西,但我也试过了,但没有用。我仍然得到相同的结果。我不知道执行此操作的最佳方法,但基本上我想要的是在删除该记录时仅向 CKRecord 的创建者订阅。

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

4

1 回答 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];

但是,当您拥有这样的逻辑时,您将为创建的每条记录创建订阅。您可以通过一个通用订阅来解决这个问题。只需为元数据字段 creatorUserRecordID 添加一个条件。然后,您必须首先获取登录的 iCloud 帐户的记录 ID,然后创建订阅,如下所示:

在容器上执行 fetchUserRecordIDWithCompletionHandler。在回调中,您将收到一个记录 ID。只需使用它来创建过滤器

    [[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
        }]

只需使用错误处理扩展此代码

于 2014-12-04T06:59:24.033 回答