向下滚动加载更多记录

load more records on scroll down

loadPost 函数最初将加载 12 条记录,并带有查询操作的 resultsLimit。接下来的 12 条记录将加载到游标中,以再次调用限制为 12 的批处理的其余部分。

我的问题是如何仅在视图向下滚动后加载接下来的 12 条记录?

import UIKit
import CloudKit

class homesVC: UICollectionViewController {

var app : [CKRecord]
var backgroundQueue : NSOperationQueue

required init?(coder aDecoder: NSCoder) {
    app = []
    backgroundQueue = NSOperationQueue()
    super.init(coder: aDecoder)
}

var refresher: UIRefreshControl!
var page: Int = 12

var uuidArray = [String]()
var picArray = [CKAsset]()


override func viewDidLoad() {
    super.viewDidLoad()

    //pull to refresh
    refresher = UIRefreshControl()
    refresher.addTarget(self, action: #selector(homesVC.refresh), forControlEvents: UIControlEvents.ValueChanged)
    collectionView?.addSubview(refresher)


    //load posts func
    loadPosts()
}

//load posts func
func loadPosts(){
        let container = CKContainer.defaultContainer()
        let database = container.publicCloudDatabase
        let predicate = NSPredicate(value: true)
        let query = CKQuery(recordType: "posts", predicate: predicate))
        let queryOperation = CKQueryOperation(query: query)
        queryOperation.resultsLimit = 12
        queryOperation.recordFetchedBlock = {
            record in

                self.app.append(record)
                self.uuidArray.append(record.valueForKey("uuid") as! String)
                self.picArray.append(record.valueForKey("pic") as! CKAsset)
                NSOperationQueue.mainQueue().addOperationWithBlock(){
                self.collectionView?.reloadData()
            }
        }

        queryOperation.queryCompletionBlock = {
            cursor, error in
            if error != nil {
                print(error!.localizedDescription)
            } else{
                if cursor != nil {

                    self.loadMore(cursor!)
                    }
                }
            }
        }
        cloudKitCentral.publicDatabase.addOperation(queryOperation)
    }

override func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView.contentOffset.y >= scrollView.contentSize.height - self.view.frame.size.height{

    }
}

func loadMore(cursor: CKQueryCursor){

    let queryOperation = CKQueryOperation(cursor: cursor)
    queryOperation.resultsLimit = 12
    queryOperation.recordFetchedBlock = {
        record in
        self.app.append(record)
        self.uuidArray.append(record.valueForKey("uuid") as! String)
        self.picArray.append(record.valueForKey("pic") as! CKAsset)
    }
    queryOperation.queryCompletionBlock = {
        cursor, error in
        if error != nil {
            print(error?.localizedDescription)
        } else {
            if cursor != nil {
                print("total records: \(self.app.count)")
                self.loadMore(cursor!)
            } else {
                print("completed query")
                NSOperationQueue.mainQueue().addOperationWithBlock(){
                    self.collectionView?.reloadData()
                }
            }
        }
    }
    container.publicDatabase.addOperation(queryOperation)
  }

安德鲁,

您偶然发现了使用云工具包最有趣的方面之一,即使用延迟和线程进行编程。为了实现你的目标,你需要使用像大中央调度块这样的设施。

使用一个或另一个启动第二步,同时进行初始查询以继续 load/preload more/post 检查加载是否完成。

前一周我在此处发布了块操作模板。

除非您准备好,否则不要同时让您的用户滚动;如果他们试图给他们一个友好的消息,告诉他们您正在等待 cloudkit 给您数据。