使用swift检查CloudKit中指定值的记录是否存在

时间:2016-11-21 16:39:09

标签: swift cloudkit

我有问题。我正在做一个具有登录功能的应用程序,并希望检查是否存在具有指定用户名的用户。所以我做了:

func doesRecordExist(inRecordType: String, withField: String, equalTo: String) -> Bool {
    print(withField,equalTo)
    var result = false

    let predicate = NSPredicate(format: "\(withField) == %@", equalTo)
    let query = CKQuery(recordType: inRecordType, predicate: predicate)
    publicDatabase.perform(query, inZoneWith: nil, completionHandler: {results, er in

        if results != nil {
            print(results!.count)
            if results?.count == 1 {
                print(results!.count)
                result = true
            }
        }
    })
    return result
}

在withField"用户名"将输入并输入相同的值将输入的值是用户名。

我做错了什么? 感谢。

修改
好吧,我终于想出了如何做rmaddy建议并且有效的方法。非常感谢你!

2 个答案:

答案 0 :(得分:0)

如果函数的结果取决于异步操作的结果,则无法从函数返回值。如上所述,函数末尾的return result行(值为false)将在数据库查询开始之前很久就被调用。

您的doesRecordExist函数需要使用perform函数的多行完成处理程序参数。

当然,您需要重构代码,调用您的doesRecordExist来处理您不会立即获得结果的事实。

答案 1 :(得分:0)

这是根据rmaddy的响应将您的代码转换为添加完成处理程序的原因,因为这应使您的代码在继续下一个代码之前等待结果。

func doesRecordExist(inRecordType: String, withField: String, equalTo: String, _ completion: @escaping (Bool) -> ()) {
    print(withField,equalTo)
    var result = false

    let predicate = NSPredicate(format: "\(withField) == %@", equalTo)
    let query = CKQuery(recordType: inRecordType, predicate: predicate)
    publicDatabase.perform(query, inZoneWith: nil, completionHandler: {results, er in

        if results != nil {
            print(results!.count)
            if results?.count == 1 {
                print(results!.count)
                result = true
            }
        }
    })
    completion(result)
}

然后您将代码在其他地方运行为:

doesRecordExist(inRecordType: String, withField: String, equalTo: String) { (result) in
                    if result == false {
                   //create new record here
                    }
                }