向下滚动加载更多记录
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 给您数据。
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 给您数据。