Пакетная загрузка с помощью асинхронного дисплея / облачного набора
Я пытаюсь реализовать пакетную загрузку для интеграции с CloudKit и Async Display Kit. Тем не менее, когда я пытаюсь прокрутить, я получаю эту ошибку:
[NSOperationQueue addOperation:]: операция завершена и не может быть поставлена в очередь '
Есть идеи, что это будет происходить? Спасибо!
Это мои сетевые звонки:
var thisCursor : CKQueryCursor?
var newQueryOP : CKQueryOperation?
func pullPosts(curLocation: CLLocation, completionHandler: @escaping(([PostMap]) -> Bool)) {
print("------------PULLING POSTS (1ST PULL) ----------------")
let location = curLocation
var annotations : [PostMap] = [PostMap]()
//let curLocation = mapLocationManager.getCurrentLocation()
let locationPredicate = NSPredicate(format: "distanceToLocation:fromLocation:(%K, %@) < %f", "Location", location,
CKConstants.loadPinsRadius)
let query = CKQuery(recordType: "PostMap", predicate: locationPredicate)
query.sortDescriptors = [CKLocationSortDescriptor(key: "Location", relativeLocation: location)]
let queryOP = CKQueryOperation(query: query)
print("SERVER DECIDED QUERY LIMIT \(queryOP.resultsLimit)")
queryOP.recordFetchedBlock = { record in
//MAKE A NEW POST (taken out for brevity)
annotations.append(postToAdd)
}
queryOP.queryCompletionBlock = { [unowned self] (cursor, error) in
DispatchQueue.main.async {
if error == nil {
if completionHandler(annotations) {
if cursor != nil {
print("THIS CURSOR IS NOT NIL")
self.thisCursor = cursor
self.newQueryOP = CKQueryOperation(cursor: cursor!)
}
}
} else {
print(error)
print("could not pull posts")
}
}
}
queryOP.resultsLimit = 15
CKContainer.default().publicCloudDatabase.add(queryOP)
}
public func continuePullPosts(curLocation: CLLocation, queryOP: CKQueryOperation,
annotations: [PostMap], completionHandler: @escaping(([PostMap]) -> Bool)) {
var annotations = annotations
print("------------CONTINUE PULLING POSTS ----------------")
queryOP.recordFetchedBlock = { record in
//MAKE A NEW POST (taken out for brevity)
annotations.append(postToAdd)
}
queryOP.queryCompletionBlock = { [unowned self] (cursor, error) in
DispatchQueue.main.async {
if error == nil {
if completionHandler(annotations) {
if cursor != nil {
print("paging posts")
self.thisCursor = cursor!
self.newQueryOP = CKQueryOperation(cursor: cursor!)
}
}
} else {
print(error)
print("could not pull posts")
}
}
}
queryOP.resultsLimit = CKConstants.subsequentPullAmount
CKContainer.default().publicCloudDatabase.add(queryOP)
}
В моем TableViewController:
func shouldBatchFetch(for tableNode: ASTableNode) -> Bool {
if (pinDataManager.thisCursor == nil) {
return false
}; return true
}
func tableNode(_ tableNode: ASTableNode, willBeginBatchFetchWith context: ASBatchContext) {
var annotations : [PostMap] = [PostMap]()
pinDataManager.continuePullPosts(curLocation: locationManager.getCurrentLocation(), queryOP: pinDataManager.newQueryOP!, annotations: annotations) { (annotations) -> Bool in
self.insertNewRowsInTableNode(annotations: annotations)
context.completeBatchFetching(true)
return true
}
}
func insertNewRowsInTableNode(annotations: [MapObject]) {
let section : NSInteger = 0
let indexPaths = NSMutableArray()
let totalPosts = self.postObjects.count + annotations.count
print(self.postObjects.count)
print(annotations.count)
for index in self.postObjects.count...totalPosts - 1 {
let path = NSIndexPath(row: index, section: section)
indexPaths.add(path)
}
self.postObjects = self.postObjects + annotations
self.tableNode.insertRows(at: indexPaths as! [IndexPath], with: .none)
}
1 ответ
Вы передаете завершенную операцию в свой continuePullPosts
функции, затем пытается повторно добавить его в базу данных.
Вместо этого вам нужно сохранить курсор, возвращенный из первой операции, передать этот курсор в continuePullPosts, а затем создать новую последующую операцию, используя initWithCursor
,
Вам нужно продолжать создавать новые операции с initWithCursor
каждый раз, когда вы получаете курсор, пока запрос в конце концов не завершится и вернет нулевой курсор.