【问题标题】:perform(_:inZoneWith:completionHandler:) deprecated? or not? iOS 15perform(_:inZoneWith:completionHandler:) 已弃用?或不? iOS 15
【发布时间】:2021-08-28 19:08:57
【问题描述】:

在 iOS 15 的 Xcode 13 测试版中,我收到一条消息,指出 perform(_:inZoneWith:completionHandler:) (CloudKit) 在 iOS 15 中已弃用并重命名为 fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:) 但是...

  1. Apple Docs 网站并未声明此方法已弃用:https://developer.apple.com/documentation/cloudkit/ckdatabase/1449127-perform

  2. Apple 展示了对 iOS 15 的其他弃用(另一种方法):https://developer.apple.com/documentation/cloudkit/ckdatabase/3794331-records/

  3. 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)
        }

}

【问题讨论】:

    标签: cloudkit xcode13 ios15


    【解决方案1】:

    我在 beta 5 中,仍然收到此警告,但该方法尚未实施,因此看起来他们并没有弃用旧方法,只是忘记删除警告。几天后我们应该会有 Xcode 的最终版本。

    更新:看起来犯了一个错误。新方法不叫fetchedRecords(),叫records()https://developer.apple.com/documentation/cloudkit/ckdatabase/3856524-records

    【讨论】:

    • 在 Xcode 13 中看起来仍然是个问题
    • 他们把名字弄错了。方法其实叫records(matching:inZoneWith:desiredKeys:resultsLimit:)developer.apple.com/documentation/cloudkit/ckdatabase/…
    • 啊。我估计。我最终更新到基于并发的构造和这个新的records(matching:inZoneWith:desiredKeys:resultsLimit:) 方法。
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多