2015-04-12 80 views
1

在我製作的應用程序中,會有大量的數據可以從iCloud加載。我的問題是,它不會將數據加載到集合視圖中,直到它完成接收所有數據(需要一段時間)。我希望應用程序在接收數據時將數據加載到集合視圖中,因此用戶不必等待。或者,應用程序一次僅加載一些數據會更好嗎?我該怎麼做呢?這是我用來加載數據的代碼。如何讓我的cloudkit應用程序加載數據作爲其加載?

注意:我在這個項目中使用了swift。

func loadInfo() { 

     let predicate:NSPredicate = NSPredicate(value: true) 
     let query:CKQuery = CKQuery(recordType: "Data", predicate: predicate) 
     query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 




     if let database = self.publicDatabase { 


      database.performQuery(query, inZoneWithID: nil, completionHandler: { (records:[AnyObject]!, error:NSError!) in 

       if error != nil { 

self.alert("Error: \(error.localizedDescription)", Message: "Make sure iCloud is turned on and you are connected to the internet") 

       } 
       else { 



        dispatch_async(dispatch_get_main_queue()) { 

         self.array.removeAll(keepCapacity: false) 

         for record in records { 

          let usernameRecord:CKRecord = record as CKRecord 
          self.array.append(usernameRecord.objectForKey("Info") as String) 





         } 

         //update data 
         self.collectionView.reloadData() 

        } 


       } 

       }) 

      }} 
+0

很好的問題。我也在尋找這個。 – CppChase

回答

4

如果您執行performQuery,記錄將一次全部返回。如果你想要進步,那麼你可以使用CKQueryOperation。然後你會得到該塊的每個記錄的呼叫:

operation.recordFetchedBlock = { record in 

當查詢準備就緒時,將會有一個呼叫。

operation.queryCompletionBlock = { cursor, error in 

返回的記錄數將限制爲最大值(通常爲100)。該值可以通過以下方式設置:

operation.resultsLimit = CKQueryOperationMaximumResults; 

只需將其設置爲所需的值即可。

這是基於從下面的評論的鏈接樣本:

func loadInfo() { 

    let p = NSPredicate(value: true) 
    let q = CKQuery(recordType: "Data", predicate: p) 
    q.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
    let queryOperation = CKQueryOperation(query: q) 
    let database = self.publicDatabase 
    self.array.removeAll(keepCapacity: false) 

    queryOperation.recordFetchedBlock = fetchedARecord 

    queryOperation.queryCompletionBlock = { [weak self] (cursor : CKQueryCursor!, error : NSError!) in 
     if error != nil { 
      self.alert("Error: \(error.localizedDescription)", Message: "Make sure iCloud is turned on and you are connected to the internet") 
     } 
     else { 
     if cursor != nil { 
      println("there is more data to fetch") 
      let newOperation = CKQueryOperation(cursor: cursor) 
      newOperation.recordFetchedBlock = self!.fetchedARecord 
      newOperation.queryCompletionBlock = queryOperation.queryCompletionBlock 
      database.addOperation(newOperation) 
      } 
     } else { 
      dispatch_async(dispatch_get_main_queue()) { 
       self.collectionView.reloadData() 
      } 
     } 

    } 

    database.addOperation(queryOperation) 
} 

var i = 0 
func fetchedARecord (record: CKRecord!) { 
    println("\(NSDate().timeIntervalSinceReferenceDate*1000) \(++i)") 
    self.array.append(record.objectForKey("Info") as String) 
} 
+0

,這裏有一個例子:http://stackoverflow.com/q/29592964/893771 – CppChase

+0

你能給我一些示例代碼嗎? –

+0

nachson fertel,請參閱CPPChase上面的鏈接樣本代碼 –

相關問題