macos – CKQueryOperation queryCompletionBlock只运行3次
我正在尝试使用CloudKit和光标从我的iCloud公共数据库下载一批记录.无论resultLimit如何设置,代码都可以在前3次执行中正常工作,但是从不执行第4个完成块.如果没有设置resultsLimit,我会得到300条记录,如果它设置为50,我会得到150,如果它设置为5,我得到15 …
没有报告错误,并且该块似乎已添加,但从未执行过.平台是OS X.这是有问题的代码: let queryOp = CKQueryOperation(query: query) queryOp.recordFetchedBlock = self.fetchedDetailRecord queryOp.resultsLimit = 5 queryOp.queryCompletionBlock = { [weak self] (cursor: CKQueryCursor!,error: NSError!) -> Void in println("comp block called with (cursor) (error)") if error != nil { println("Error on fetch (error.userInfo)") } else { if cursor != nil { let nextOp = CKQueryOperation(cursor: cursor) nextOp.recordFetchedBlock = self!.fetchedDetailRecord nextOp.queryCompletionBlock = queryOp.queryCompletionBlock nextOp.resultsLimit = 5 self!.publicDatabase?.addOperation(nextOp) println("added next fetch") } else { self!.fileHandle!.closeFile() self!.exportProgressIndicator.stopAnimation(self) } } } self.publicDatabase?.addOperation(queryOp) 这是控制台的结果 – 459013587628.012 0 大数字只是对recordFetchedBlock的调用之间的时间,第二个数字是调用该块的次数. 我很难过……关于如何进行的任何想法?哦,container和publicDatabase是类变量,并在运行上面的代码片段之前进行了初始化.
您在queryCompletionBlock范围内定义nextOp的方式在该块的三次迭代后导致问题.如果你将CKQueryOperation的创建分解为自己的方法,你的问题就会消失.
这是代码: func fetchedDetailRecord(record: CKRecord!) -> Void { println("Retrieved record: (record)") } func createQueryOperation(cursor: CKQueryCursor? = nil) -> CKQueryOperation { var operation:CKQueryOperation if (cursor != nil) { operation = CKQueryOperation(cursor: cursor!) } else { operation = CKQueryOperation(query: CKQuery(...)) } operation.recordFetchedBlock = self.fetchedDetailRecord operation.resultsLimit = 5 operation.queryCompletionBlock = { [weak self] (cursor: CKQueryCursor!,error: NSError!) -> Void in println("comp block called with (cursor) (error)") if error != nil { println("Error on fetch (error.userInfo)") } else { if cursor != nil { self!.publicDatabase?.addOperation(self!.createQueryOperation(cursor: cursor)) println("added next fetch") } else { self!.fileHandle!.closeFile() self!.exportProgressIndicator.stopAnimation(self) } } } return operation } func doQuery() { println("Querying records...") self.publicDatabase?.addOperation(createQueryOperation()) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |