Изменение положения табличного представления с помощью новых сообщений из облачного набора с набором текстур / асинхронного отображения
Я пытаюсь реализовать пакетную загрузку для интеграции с CloudKit и Async Display Kit. Однако всякий раз, когда я загружаю новые данные в представление таблицы (на основе асинхронного набора отображения / текстуры), мое положение в таблице часто портится, прокручивая меня обратно наверх. Есть ли способ сделать так, чтобы моя прокрутка происходила плавно или, по крайней мере, не перемещалась во время ожидания новых сообщений? Спасибо!
Это мои сетевые звонки:
var thisCursor : CKQueryCursor?
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
}
}
} else {
print(error)
print("could not pull posts")
}
}
}
queryOP.resultsLimit = 15
CKContainer.default().publicCloudDatabase.add(queryOP)
}
public func continuePullPosts(curLocation: CLLocation, curCursor: CKQueryCursor,
annotations: [PostMap], completionHandler: @escaping(([PostMap]) -> Bool)) {
let queryOP = CKQueryOperation(cursor: curCursor)
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(), curCursor: pinDataManager.thisCursor!, 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)
}