我的目标是能够在我的应用程序背景化时使用CloudKit保存记录。我首先获取我正在尝试修改的记录,修改它,然后保存它。我正在从我的app delegate的applicationDidEnterBackground进行此调用:
CKDatabase *db = [[CKContainer defaultContainer] privateCloudDatabase];
CKRecordID *recordId = [[CKRecordID alloc] initWithRecordName:@"record_a"];
[db fetchRecordWithID:recordId completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {
// Doesn't get here until I foreground the app
if (!record) // Doesn't exist yet so create it
{
record = [[CKRecord alloc] initWithRecordType:@"SaveData" recordID:recordId];
}
NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/file"];
CKAsset *saveAsset = [[CKAsset alloc] initWithFileURL:fileURL];
record[@"saveAsset"] = saveAsset;
[db saveRecord:record completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable saveError) {
// Doesn't get here until I foreground
}];
}];
fetchRecordWithID调用的完成块在我再次前置应用程序之前不会被触发,这意味着在此之前不会调用saveRecord:call。
我尝试使用CKOperation版本的fetch并使用修改后的qualityOfService和queuePriority属性保存无效。还尝试设置longLived属性,但这也不起作用。我已经搜索了文档,并且找不到任何可以阻止在应用程序背景时阻止阻止的块。
我有其他代码可以在后台调用完成块,所以不确定为什么这会受到限制。有什么想法吗?