3

レコードをフェッチするさまざまな方法を試し、stackoverflow で同じ問題を確認しましたが、100 を超えるレコードをフェッチすることはできません。

以前は、CKQueryOperation の代わりに CKQuery を使用してresultsLimitパラメーターを使用していました。

これが私のコードです:

    func initData(){
        // show activity indicator
        self.activityIndicatorView.hidden = false
        // hide connection error button
        self.connectionErrorButton.hidden = true

        let container = CKContainer.defaultContainer()
        let publicDB = container.publicCloudDatabase

        let predicate = NSPredicate(value: true)
        let sort = NSSortDescriptor(key: "id", ascending: true)

        var newInfo = Array<CKRecord>()

        let query = CKQuery(recordType: "info", predicate:  predicate)
        query.sortDescriptors = [sort]

        let queryOperation = CKQueryOperation(query: query)
        queryOperation.queuePriority = .VeryHigh
        queryOperation.resultsLimit = 150;

        // Fetch the pokemons for the record
        func fetched(record: CKRecord!) {
            newInfo.append(record)
        }

        queryOperation.recordFetchedBlock = fetched

        queryOperation.queryCompletionBlock = { [unowned self] (cursor, error) in
            if (error != nil) {
                dispatch_async(dispatch_get_main_queue()) {
                    self.connectionErrorButton.hidden = false
                    self.activityIndicatorView.hidden = true
                    return
                }
            } else {
                dispatch_async(dispatch_get_main_queue()) {
                    self.infos.removeAll()
                    self.infos = newInfo
                    self.tableView.reloadData()
                    self.activityIndicatorView.hidden = true
                    return
                }
            }
        }
        publicDB.addOperation(queryOperation)
    }
4

1 に答える 1

2

iOS 9.3 以下ではCKQueryCursor、複数のフェッチ操作を実行し、フェッチのどこにいたかを追跡するために を使用する必要があります。これは、完了ブロックで返されたカーソル オブジェクトです。それを使用して別の操作を作成できます。次のように、残した場所から取得します。

queryOperation.queryCompletionBlock = { (cursor, error) in
    if let cursor = cursor {
         let cursorOperation = CKQueryOperation(cursor: cursor)
         cursorOperation.queryCompletionBlock = //Handle it again
    }
    //Do stuff
}

複数のカーソルが到着した場合にカーソル ベースのクエリ操作を再帰的に作成できるように、カーソルを操作するときに再利用可能なハンドラー ブロックを作成することがよくあります。

于 2016-08-10T15:22:09.040 に答える