Добавить блокировку в Swift for-loop

Я использую Swift в проекте и использую SQLite.swift для обработки базы данных. Я пытаюсь получить самую последнюю запись из моей базы данных, как показано ниже:

func returnLatestEmailAddressFromEmailsTable() -> String{

    let dbPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String
    let db = Database("\(dbPath)/db.sqlite3")
    let emails = db["emails"]
    let email = Expression<String>("email")
    let time = Expression<Int>("time")

    var returnEmail:String = ""

    for res in emails.limit(1).order(time.desc) {
        returnEmail = res[email]
        println("from inside: \(returnEmail)")
    }

    return returnEmail

}

Я пытаюсь проверить возвращаемую строку из приведенной выше функции следующим образом:

println("from outside: \(returnLatestEmailAddressFromEmailsTable())")

Обратите внимание, как я печатаю значение как внутри, так и снаружи функции. Внутри он работает каждый раз. Я борюсь с частью «извне:».

Иногда функция возвращает правильный адрес электронной почты, а иногда возвращает "" (предположительно, значение не было задано в цикле for).

Как я могу добавить «блокирующую» функцию, чтобы вызов returnLatestEmailAddressFromEmailsTable() всегда сначала оценивал цикл for и только после этого возвращал значение?


person Camillo    schedule 30.01.2015    source источник
comment
Цикл for всегда оценивается, но только для количества существующих строк. В вашем случае кажется, что запрос иногда не возвращает строк. Убедитесь, что в вашей таблице действительно есть строки (попробуйте вывести emails.count). Кроме того, в SQLite.swift есть вспомогательный метод для извлечения одной строки. Вы должны быть в состоянии переписать цикл for и присваивание выше с помощью одной строки: return emails.order(time.desc).first?[email]. Однако это возвращает String?, поэтому используйте ! для принудительной развертки, если вы считаете, что это может привести к сбою, если строка равна нулю, или используйте ?? "", если вы хотите вернуть пустую строку.   -  person stephencelis    schedule 31.01.2015
comment
Вау, спасибо, Стивен, это мне очень помогло. Я хотел бы воспользоваться возможностью, чтобы поблагодарить вас за вашу фантастическую работу над проектом SQLite.swift. Я так взволнован, чтобы поиграть с ним в моем проекте. Я действительно впечатлен! Так держать и еще раз спасибо!   -  person Camillo    schedule 01.02.2015