Тествайте за наличие или липса на запис в CloudKit със Swift 2

Пиша приложение за tvOS. Искам да тествам дали има запис в базата данни на CloudKit.

Опитвам се да направя това, като видя дали има запис с конкретен eventID.

В идеалния случай искам да извикам функция, която връща true или false:

if isEventInWatchListFile(eventID) {
 // ... do things
}

Това, което опитах е следното:

 var results = [AnyObject]()
 var onList:Bool?

 . . .

    func isEventInWatchListFile(eventID: String) -> Bool {

        let container = CKContainer(identifier: "the container")
        let privateDB = container.privateCloudDatabase

        let predicate = NSPredicate(format: "eventID == %@",eventID)
        let query = CKQuery(recordType: "UserWatchlist", predicate: predicate)

        privateDB.performQuery(query, inZoneWithID: nil) { results , error in
            guard let results = results else {
                // error handler to come
                return
            }

            if results[0]["eventID"] != nil {

              self.onList = true

            } else {

              self.onList = false
            }
        }

        return self.onList!
    }

Това се срива с "фатална грешка: неочаквано намерена нула при разопаковане на незадължителна стойност". Мисля, че това е така, защото onList е заключено в затваряне. Имам два въпроса:

1) Възможно ли е да се предаде onList на оператора return и, ако да, как? Прочетох за затваряния в Swift, но не съм сигурен как да приложа прочетеното.

2) Има ли по-добър начин да направя теста, който искам да направя? Подходът ми изглежда тромав.

Аз съм много нов в iOS и Swift. Всяка помощ се получава много добре.


person Peter Wiley    schedule 10.12.2015    source източник


Отговори (1)


Ако прочетох кода ви правилно, вашето изявление

return self.onList!

винаги ще се провали, защото задавате стойността асинхронно и стойността по подразбиране (нула) се предава на връщането, преди асинхронната операция да приключи.

Вместо func isEventInWatchListFile(eventID: String) -> Bool можете да създадете нещо като func doSomethingEventInWatchListFile(eventID: String, funcToRunIfEventIsInTheWatchList: () -> Void). Тогава ще имате:

        if results[0]["eventID"] != nil {

          funcToRunIfEventIsInTheWatchList()

        } else ...
person MirekE    schedule 10.12.2015
comment
MirekE, благодаря много. Вие, разбира се, сте прави и вашата стратегия има смисъл. В контекста на по-големия модел на данни ще трябва да преструктурирам някои неща, но вашата идея ми дава път напред. - person Peter Wiley; 11.12.2015