执行(_:inZoneWith:completionHandler :) 已弃用?或不? iOS 15
perform(_:inZoneWith:completionHandler:) deprecated? or not? iOS 15
在 Xcode 13 beta for iOS 15 中,我收到一条消息,指出 perform(_:inZoneWith:completionHandler:)
(CloudKit) 在 iOS 15 中已弃用并重命名至 fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)
然而...
Apple Docs 网站未声明此方法已弃用:https://developer.apple.com/documentation/cloudkit/ckdatabase/1449127-perform
Apple 显示了 iOS15 的其他弃用(另一种方法):https://developer.apple.com/documentation/cloudkit/ckdatabase/3794331-records/
fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)
似乎不存在.. 然而.. (Value of type 'CKDatabase' has no member 'fetchRecords'
)
那么,这只是一个不正确的消息,因为它是测试版吗?我是否应该担心重写使用 perform(_:inZoneWith:completionHandler:)
的函数?
这是我的函数,我试图将它改编为 fetchRecords,但它不存在。我试着让它适应 fetch(withQuery:completionHandler:
但我有点迷失了它的工作..
(此功能只是删除iCloud私有数据库中的记录):
let container = CKContainer(identifier: "MyContainerNameHere")
let recordType = "DBName"
//delete all saved icloud records
let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
container.privateCloudDatabase.perform(query, inZoneWith: nil) { (rec, err) in
if let err = err {
print(err.localizedDescription)
completion(.failure(err))
return
}
guard let rec = rec else {
completion(.failure(CloudKitHelperError.castFailure))
return
}
for record in rec {
container.privateCloudDatabase.delete(withRecordID: record.recordID) { (recordId, err) in
if let err = err {
print(err.localizedDescription)
completion(.failure(err))
return
}
guard recordId != nil else {
completion(.failure(CloudKitHelperError.recordIDFailure))
return
}
}
}
}
任何见解表示赞赏..
感谢
更新
我会说,是的,这似乎是一个错误或至少是一个过早的消息,但是,在重写 async/await 的代码之后,它变得更加清晰易读。对于那些努力解决这个问题的人,这里是上面的代码转换为 Async/Await:
的示例
@MainActor func newDeleteCloudKit() async throws {
let container = CKContainer(identifier: "MyContainerNameHere")
let recordType = "DBName"
let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
let result = try await container.privateCloudDatabase.records(matching: query)
for record in result.0 {
try await container.privateCloudDatabase.deleteRecord(withID: record.0)
}
}
我在测试版 5 中,仍然收到此警告,但该方法尚未实施,因此看起来他们并没有弃用旧方法,只是忘了删除警告。我们应该在几天内得到 Xcode 的最终版本。
更新:看起来好像犯了一个错误。新方法不叫 fetchedRecords(),叫 records() https://developer.apple.com/documentation/cloudkit/ckdatabase/3856524-records
在 Xcode 13 beta for iOS 15 中,我收到一条消息,指出 perform(_:inZoneWith:completionHandler:)
(CloudKit) 在 iOS 15 中已弃用并重命名至 fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)
然而...
Apple Docs 网站未声明此方法已弃用:https://developer.apple.com/documentation/cloudkit/ckdatabase/1449127-perform
Apple 显示了 iOS15 的其他弃用(另一种方法):https://developer.apple.com/documentation/cloudkit/ckdatabase/3794331-records/
fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)
似乎不存在.. 然而.. (Value of type 'CKDatabase' has no member 'fetchRecords'
)
那么,这只是一个不正确的消息,因为它是测试版吗?我是否应该担心重写使用 perform(_:inZoneWith:completionHandler:)
的函数?
这是我的函数,我试图将它改编为 fetchRecords,但它不存在。我试着让它适应 fetch(withQuery:completionHandler:
但我有点迷失了它的工作..
(此功能只是删除iCloud私有数据库中的记录):
let container = CKContainer(identifier: "MyContainerNameHere")
let recordType = "DBName"
//delete all saved icloud records
let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
container.privateCloudDatabase.perform(query, inZoneWith: nil) { (rec, err) in
if let err = err {
print(err.localizedDescription)
completion(.failure(err))
return
}
guard let rec = rec else {
completion(.failure(CloudKitHelperError.castFailure))
return
}
for record in rec {
container.privateCloudDatabase.delete(withRecordID: record.recordID) { (recordId, err) in
if let err = err {
print(err.localizedDescription)
completion(.failure(err))
return
}
guard recordId != nil else {
completion(.failure(CloudKitHelperError.recordIDFailure))
return
}
}
}
}
任何见解表示赞赏..
感谢
更新 我会说,是的,这似乎是一个错误或至少是一个过早的消息,但是,在重写 async/await 的代码之后,它变得更加清晰易读。对于那些努力解决这个问题的人,这里是上面的代码转换为 Async/Await:
的示例@MainActor func newDeleteCloudKit() async throws {
let container = CKContainer(identifier: "MyContainerNameHere")
let recordType = "DBName"
let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
let result = try await container.privateCloudDatabase.records(matching: query)
for record in result.0 {
try await container.privateCloudDatabase.deleteRecord(withID: record.0)
}
}
我在测试版 5 中,仍然收到此警告,但该方法尚未实施,因此看起来他们并没有弃用旧方法,只是忘了删除警告。我们应该在几天内得到 Xcode 的最终版本。
更新:看起来好像犯了一个错误。新方法不叫 fetchedRecords(),叫 records() https://developer.apple.com/documentation/cloudkit/ckdatabase/3856524-records