2017-07-27 36 views
9

Genel veritabanından 500 "Ziyaret" kayıtlarını aşağı çekmek istiyorum. CloudKit sadece bir seferde 100 kayıt veriyor, bu yüzden istediğim tüm kayıtları almak için aşağıdaki gibi CKQueryCursor'u kullanıyorum. gayet iyi çalışıyorCKError: Sorgu süzgeci değer sınırını aşıyor: kapsayıcı için 250:

fetchVisits() 

, bana yetiyor ziyaretleri alır:

func fetchVisits(_ cursor: CKQueryCursor? = nil) { 
    print("fetchVisits \(cursor)") 
    var operation: CKQueryOperation! 
    if let cursor = cursor { 
     operation = CKQueryOperation(cursor: cursor) 
    } else { 
     let query = CKQuery(recordType: "Visit", predicate: NSPredicate(format: "Client IN %@ AND ANY Students IN %@", visitClients, visitStudents)) 
     operation = CKQueryOperation(query: query) 
    } 
    operation.recordFetchedBlock = { 
     (record) in 
     totalVisits.append(record) 
    } 
    operation.queryCompletionBlock = { 
     (cursor, error) in 
     if let error = error { 
      //handle error 
     } else if let cursor = cursor { 
      self.fetchVisits(cursor) 
     } else { 
      //all done! 
     } 
    } 
    CKContainer.default().publicCloudDatabase.add(operation) 
} 

ben fonksiyonu gibi diyoruz. Konsol Log

fetchVisits nil 
fetchVisits Optional(<CKQueryCursor: 0x174228140; id=4bb7887c326fc719, zone=(null)>) 
fetchVisits Optional(<CKQueryCursor: 0x17422a320; id=f67fb25669486da9, zone=(null)>) 
fetchVisits Optional(<CKQueryCursor: 0x174228380; id=7e87eb8b7cfe1a74, zone=(null)>) 
fetchVisits Optional(<CKQueryCursor: 0x17422cc80; id=e77e47ef2b29c8a4, zone=(null)>) 

Ama konu ben bir düğmeye basmak zaman yenilemek istiyorum ve şimdi bana bu hata veriyor şimdi:

"Servis Yok" (6/2022); "İstek, http durum kodu 503 ile başarısız oldu"; 30.0 saniye sonra yeniden deneyin.

Oldukça açıklayıcı olan bu, sanırım 500 kadar kayıt talep ederek sunucuyu ezici yapıyorum? Bu yüzden 30 saniye bekleyip işlevi tekrar çağırıyorum ve şimdi bu hatayı alıyorum.

"Limit Aşıldı" (27/2023); server message = "Sorgu süzgeci değerlerin sınırını aşıyor: kapsayıcı için 250: kapsayıcı için 250

Bu nedenle, bu işlevi yeniden çalıştıramıyorum. Uygulamayı yeniden başlatırsam tekrar çalışır, ancak yalnızca ilk kez çalışır. Bir CKQueryCursor döndüren herhangi bir tabloya özgü.Ayrıca 100 kayıttan daha az (yani imleç nil) olan ve ben birden çok kez herhangi bir sorun olmadan çekebiliyorum başka tabloları var.

cevap

4

Tamam, bunu daha önce de gördüm ve sorunun CloudKit sunucularında bir hata olduğuna inanıyorum. Benim tecrübemde, karmaşık sorgularla ilgili. Size yüklemi değiştirmeyi denerseniz

: senin HERHANGİ kısmını kaldırarak mevcut bir basitleştirilmesi

NSPredicate(value: true) 

Hatta, o düzeltmek için yeterli olabilir.

+1

Sadece bu yüklemeyle test edildi: NSPredicate (format: "İstemci IN% @", visitClients) ve şimdi herhangi bir sunucu hatası olmadan istediğim kadar getirmeyi çağırabilirim. Şimdi getirildikten sonra sonuçlara ikincil yüklem süzgecini yapıyorum. Bu utanç verici çünkü ben şimdi sunucuya isabet ediyorum ve iyi bir sebepten dolayı ihtiyacım olandan daha fazla kayıt WAY getiriyorum. –

1

İsteniyorsunuz Sorgulama işleminiz tamamlanmadan önce iCloud'a daha fazla CKRecords gönderimi tamamlandı

... 
operation.queryCompletionBlock = { 
    (cursor, error) in 
    if let error = error { 
     //handle error 
    } else if let cursor = cursor { 
     self.fetchVisits(cursor) 
    } else { 
     //all done! 
    } 
} 
... 

İşlev self.fetchVisits(cursor) çağrı tamamlama bloğu içinde yapılır, bu, mevcut işleminiz bitmeden önce daha fazla kayıt isteğinde bulunduğunuz anlamına gelir.

Olası çözüm, kapata aldığınız cursos'u geçen bir daha self.fetchVisits numaralı telefonu geçtiğinizde, daha fazla kayda ihtiyaç duyduğunda CKQueryCursor'ı eklediğiniz bir kapama (completionHandler) kullanmaktır (bir tabloya kaydırın).

+0

"queryCompletionBlock" işleminin sonu olduğunu sanıyordum? Bu parçayı tamir edeceğim ama hataya neden olan şeyin bu olduğundan emin değilim. İşlemin 5 kez tamamlandığını ve ihtiyacım olan tüm kayıtları aldığımı görüyorum ama daha sonra bir tuşa bastığımda tekrar fonksiyonu çağırmak için CloudKit sunucu hatalarını alıyorum. –

+0

Merhaba @WilliamT. Haklısınız, sorguCompletionBlock sadece bir kez yürütülür. Biraz daha kod yazabilirsen belki sana yardım edebilirim ... – Adolfo

+0

Yardım etmeye çalıştığınız için teşekkürler, ancak ne kadar kod yazabileceğimi bilmiyorum.Yukarıdaki işlev, çalıştırdığım ilk seferde harika çalışıyor ancak bana daha fazla kod yazmamak için sunucu hatası veriyor. –