来自 iCloud/CloudKit 的序列号

Posted

技术标签:

【中文标题】来自 iCloud/CloudKit 的序列号【英文标题】:Sequence number from iCloud/CloudKit 【发布时间】:2019-09-13 01:08:17 【问题描述】:

我想使用 CloudKit、Swift 4.2+ 和 ios 11+ 从 iCloud 获取顺序发票编号。

我从来没有在 iCloud 上做过这个。不知道最好的方法是什么。

此号码将被写入 PDF 文档,该文档将保存回公共 iCloud 数据库。

谓词是有限的。我认为我不能使用 max(number)。显然没有 SQL 选项。

我正在考虑在使用数字时使用通知来更新每个设备并将其存储在本地。但我能相信吗?还是我创建另一个服务器只是为了获得一个唯一的号码?

不确定我是否可以使用限制为 1 并按日期排序的查询,然后用可能的数字预填充记录(请参见下面的代码),还是每次只更新一条记录?

func getNextInvoiceNumber() 

    let predicate = NSPredicate(format: "status == %@", "unused")
    let query = CKQuery(recordType: "Sequence", predicate: predicate)
    query.sortDescriptors = [NSSortDescriptor(key: "sequenceNumber", ascending: true)]

    let operation = CKQueryOperation(query: query)
    operation.resultsLimit = 1
    operation.recordFetchedBlock =  (record) in

        DispatchQueue.main.async 
            let invoiceNumber = record["sequenceNumber"]
            // Update the Record so that it is not used again using CKModifyRecordsOperation
            record["status"] = "used" // do I also set recordName because it must be unique?
            // save this record back to iCloud so it can't be used again
            // if I can save it successfully I can use it
            self.saveUsedInvoiceNumber(record: record) // will need to retry this in case someone got this number before my save
            // Write a valid invoiceNumber to the PDF
            self.addInvoiceNumberToDocument(number: invoiceNumber as! Double) // prob move to completion handler from above
        

    
    CKContainer.default().publicCloudDatabase.add(operation)


func saveUsedInvoiceNumber(record: CKRecord) 
    // CKModifyRecordsOperation(...)
    //



func addInvoiceNumberToDocument(number: Double) 
    // write invoice Number to the PDF file and save to disk
    // save PDF file to iCloud

我注意到与多个事务和并发用户发生冲突的可能性。

对您在 iCloud 中处理此问题的方式有何建议?

【问题讨论】:

【参考方案1】:

在这里,如果不是离线要求,您建议的方式将起作用。您应该使用一条记录而不是数组。数组将每天增加大小,并可能在获取时间产生问题。

【讨论】:

【参考方案2】:

iCloud 中的每条记录都有一个唯一的 ID。为什么不将其用作您的发票编号,除非您删除并重新创建记录,否则它不应更改。您可以免费获得。

【讨论】:

以上是关于来自 iCloud/CloudKit 的序列号的主要内容,如果未能解决你的问题,请参考以下文章

iCloud / CloudKit 用户的唯一标识符

iCloud、CloudKit、iOS 8、Apple id

我如何检查用户是不是切换了 iCloud 帐户?

序列化和反序列化来自用户定义类的对象

使用来自流的 boost binary_iarchive 序列化和反序列化

来自趋势 python 的时间序列拟合值