0

こんにちは、ユーザーの名前を入力して、ユーザーに対応するレコードを返信する小さな関数を作成しようとしています。私は迅速なファイルを作成しました:

import Foundation
import CloudKit
import UIKit


func getGetMainUser(name : String) -> CKRecord {
var myRecord : CKRecord!
let container = CKContainer.defaultContainer()
let publicDB = container.publicCloudDatabase
let predicate = NSPredicate(format: "nickName == name")
let query = CKQuery(recordType: "usersAtributes", predicate: predicate)

publicDB.performQuery(query, inZoneWithID: nil) {
    record, error in {
        if error != nil {
            println(error.localizedDescription)
        } else {
            if record.count == 1 {
                myRecord = record[0] as CKRecord
            }
        }
    }
}
return myRecord
}

私が理解していないのは、performQuery の inZoneWithID の値が nil であるため、このコードをコンパイルできないことです。この構文は、私のコードの他の部分では機能しますが、正しくない可能性があります。これは私が得るエラーです:

Cannot convert the expression's type '(CKQuery!, inZoneWithID: NilLiteralConvertible, ((ST5,(ST5,ST6) -> (ST5, ST6) -> ST4) -> (ST5,(ST5,ST6)-> ST4) -> ST4,((ST5,ST6) -> (ST5,ST6)...
4

2 に答える 2

0

問題は zoneID ではありません。そのためのドキュメントには次のように書かれています:

検索するゾーンの ID。検索結果は、指定したゾーン内のレコードに限定されます。データベースのデフォルト ゾーンを検索するには、nil を指定します。

間違っているのは述語です。そのはず:

NSPredicate(形式: "ニックネーム = %@", 名前)

もう 1 つ、PerformQuery は非同期で実行されます。したがって、まだ設定されていない間に myRecord を返しています。2 つのオプションがあります。

  1. セマフォを使用して、このメソッドを同期させることができます。
  2. 値を返す代わりに、コード ブロックを渡すときにメソッドを呼び出すことができます。次に、そのコード ブロックをそのレコードで呼び出します。

オプション 2 が推奨される方法です。オプション 1 では、CloudKit の呼び出し中にアプリがロックされます。

于 2015-02-17T09:58:21.903 に答える
0

わかりました、ようやく(初心者の)間違いを見つけました。エラーの原因となる余分な/役に立たないブラケットを2つ追加しました。開場直後

record, error in

そして閉店直前

return myRecord 

それらを削除したので、すべて問題ありません。Edwin に感謝します。コードがコンパイルされたので、あなたの有用な回答が大いに役立ちます。

于 2015-02-17T22:31:24.003 に答える