Тест на наличие или отсутствие записи в 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!
    }

Это вылетает с «фатальной ошибкой: неожиданно найдено nil при развертывании необязательного значения». Я думаю, это потому, что onList заперт в закрытии. У меня есть два вопроса:

1) Можно ли передать onList оператору return, и если да, то как? Я читал о замыканиях в Swift, но не знаю, как применить то, что я прочитал.

2) Есть ли лучший способ сделать тест, который я хочу сделать? Мой подход кажется мне неуклюжим.

Я очень новичок в iOS и Swift. Любая помощь принята с благодарностью.


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


Ответы (1)


Если я правильно прочитал ваш код, ваше утверждение

return self.onList!

всегда будет терпеть неудачу, потому что вы устанавливаете значение асинхронно, а значение по умолчанию (nil) передается в возврат до завершения асинхронной операции.

Вместо 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