2015-12-10 1 views
0

Я пишу приложение tvOS. Я хочу проверить, есть ли запись в базе данных CloudKit.Проверка наличия или отсутствия записи в CloudKit с Swift 2

Я пытаюсь сделать это, посмотрев, есть ли запись с конкретным eventID.

В идеале, я хочу, чтобы вызвать функцию, которая возвращает истину или ложь:

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. Любая помощь с благодарностью получена.

ответ

1

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

return self.onList! 

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

Вместо func isEventInWatchListFile(eventID: String) -> Bool вы можете создать что-то вроде func doSomethingEventInWatchListFile(eventID: String, funcToRunIfEventIsInTheWatchList:() -> Void). Тогда у вас будет:

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

      funcToRunIfEventIsInTheWatchList() 

     } else ... 
+0

MirekE, спасибо большое. Вы, конечно, правы, и ваша стратегия имеет смысл. В контексте более крупной модели данных мне придется перестроить некоторые вещи, но ваша идея дает мне дорогу вперед. –

+0

Пожалуйста, отметьте этот ответ как принято. –