2015-07-19 17 views
6

Tôi đang cố tải xuống một loạt bản ghi từ cơ sở dữ liệu công khai iCloud của tôi bằng CloudKit và con trỏ. Mã hoạt động tốt cho 3 lần thực thi đầu tiên, bất kể cách resultsLimit được đặt, nhưng khối hoàn thành thứ 4 không bao giờ được thực thi. Nếu resultsLimit không được thiết lập, tôi nhận được 300 bản ghi, nếu nó được đặt thành 50 tôi nhận được 150, nếu nó được đặt thành 5 tôi nhận được 15 ...Truy vấn CKQueryOperationCompletionBlock chỉ chạy 3 lần

Không có lỗi nào được báo cáo và khối dường như được thêm vào nhưng không bao giờ được thực hiện. Platform là OS X. Dưới đây là mã trong câu hỏi:

 let queryOp = CKQueryOperation(query: query) 
     queryOp.recordFetchedBlock = self.fetchedDetailRecord 
     queryOp.resultsLimit = 5 
     queryOp.queryCompletionBlock = { [weak self] 
      (cursor: CKQueryCursor!, error: NSError!) -> Void in 
      println("comp block called with \(cursor) \(error)") 
      if error != nil { 
      println("Error on fetch \(error.userInfo)") 
      } else { 
      if cursor != nil { 
       let nextOp = CKQueryOperation(cursor: cursor) 
       nextOp.recordFetchedBlock = self!.fetchedDetailRecord 
       nextOp.queryCompletionBlock = queryOp.queryCompletionBlock 
       nextOp.resultsLimit = 5 
       self!.publicDatabase?.addOperation(nextOp) 
       println("added next fetch") 
      } else { 
       self!.fileHandle!.closeFile() 
       self!.exportProgressIndicator.stopAnimation(self) 
      } 
      } 
     } 

     self.publicDatabase?.addOperation(queryOp) 

Và đây là kết quả từ bàn điều khiển -

459013587628,012 0 459013587628,621 1 459013587628,863 2 459013587629,113 3 459013587629,339 4 comp khối gọi với nil đã thêm lần tìm nạp tiếp theo 459013587828.552 5 459013587828.954 6 459013587829.198 7 459013587829.421 8 4 khối 59013587829.611 9 comp gọi với nil thêm tiếp theo lấy 459013587997,084 10 459013587997,479 11 459013587997,74 12 459013587997,98 13 459013587998,207 14

Số lớn chỉ là thời gian giữa các cuộc gọi đến recordFetchedBlock với số thứ hai là số số lần khối đó đã được gọi.

Tôi đang bối rối ... bất kỳ ý tưởng nào về cách tiến hành? Oh, container và publicDatabase là các biến lớp và được khởi tạo trước khi chạy đoạn mã ở trên.

Trả lời

5

Cách bạn đang xác định nextOp bên trong truy vấn của bạnCompletionBlock phạm vi đang gây ra sự cố sau ba lần lặp lại của khối đó. Nếu bạn phá vỡ việc tạo ra các CKQueryOperation ra vào phương pháp riêng của mình vấn đề của bạn biến mất.

Đây là mã:

func fetchedDetailRecord(record: CKRecord!) -> Void { 
    println("Retrieved record: \(record)") 
} 

func createQueryOperation(cursor: CKQueryCursor? = nil) -> CKQueryOperation { 
    var operation:CKQueryOperation 
    if (cursor != nil) { 
     operation = CKQueryOperation(cursor: cursor!) 
    } else { 
     operation = CKQueryOperation(query: CKQuery(...)) 
    } 
    operation.recordFetchedBlock = self.fetchedDetailRecord 
    operation.resultsLimit = 5 
    operation.queryCompletionBlock = { [weak self] 
     (cursor: CKQueryCursor!, error: NSError!) -> Void in 
     println("comp block called with \(cursor) \(error)") 
     if error != nil { 
      println("Error on fetch \(error.userInfo)") 
     } else { 
      if cursor != nil { 
       self!.publicDatabase?.addOperation(self!.createQueryOperation(cursor: cursor)) 
       println("added next fetch") 
      } else { 
       self!.fileHandle!.closeFile() 
       self!.exportProgressIndicator.stopAnimation(self) 
      } 
     } 
    } 
    return operation 
} 

func doQuery() { 
    println("Querying records...") 
    self.publicDatabase?.addOperation(createQueryOperation()) 
} 
+0

Cảm ơn Dave, xin lỗi đã dành quá lâu để trả lời nhưng bạn phản ứng đã chết. Khi tôi chuyển nó thành chức năng riêng của nó, truy vấn chạy hoàn hảo. – Oswaldt

+1

Cảm ơn! Tuy nhiên, có vẻ như operation.cursor = cursor không làm cho hoạt động bắt đầu với con trỏ; thay vì sử dụng hoạt động = CKQueryOperation (con trỏ: con trỏ) làm việc cho tôi - suy nghĩ? – hyouuu

+0

Ahh, bắt tốt. Các tài liệu thực sự nói "Khi bạn sử dụng con trỏ, nội dung của thuộc tính truy vấn bị bỏ qua" vì vậy tôi đã cập nhật mẫu mã cho phù hợp. –

0

Đây có thể là cách tiếp cận khác (đã được cập nhật để Swift 3).

Nó không dừng lại sau lần lặp thứ ba, nhưng vẫn tiếp tục cho đến cuối cùng

var queryOp = CKQueryOperation(query: query) 
queryOp.recordFetchedBlock = self.fetchedARecord 
queryOp.resultsLimit = 5 
queryOp.queryCompletionBlock = { [weak self] (cursor : CKQueryCursor?, error : Error?) -> Void in 
    print("comp block called with \(cursor) \(error)") 

    if cursor != nil { 
     let nextOp = CKQueryOperation(cursor: cursor!) 
     nextOp.recordFetchedBlock = self!.fetchedARecord 
     nextOp.queryCompletionBlock = queryOp.queryCompletionBlock 
     nextOp.resultsLimit = queryOp.resultsLimit 

     //this is VERY important 
     queryOp = nextOp 

     self!.publicDB.add(queryOp) 
     print("added next fetch") 
    } 

} 

self.publicDB.add(queryOp) 

tôi thành công sử dụng nó để lấy hàng trăm hồ sơ từ CloudKit

Các vấn đề liên quan