2016-04-04 7 views
1

loadPost関数は、最初にクエリ操作のresultsLimitで12レコードをロードします。次の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) 
    } 

答えて

0

アンドリュー、

あなたはそれがレイテンシとスレッドを使用してプログラミングされ、クラウドキットを使用しての最も興味深い側面の一つに出くわしてきました。あなたの目標を達成するためには、巨大な中央派遣のブロックのような施設を使う必要があります。

2つ目のトレッドを同時に起動して、最初のクエリを実行してロード/プリロードを続行すると、より多くの/ポストチェックロードが完了します。

もう1週間、ブロック操作テンプレートをここに掲示しました。

How to determine when all images have been downloaded from a set in Swift?

あなたの準備ができていない限り、その間のスクロールでユーザーを聞かせてはいけません。彼らがあなたにクラウドキットがあなたにデータを与えるのを待っていることを伝えてくれれば、フレンドリーなメッセージを伝えようとします。

関連する問題