В чем основное различие между «функцией возврата» и «функцией обратного вызова»? - PullRequest
0 голосов
/ 21 мая 2019

Я думаю, что я собираюсь изменить все мои функции кода с "функций обратного вызова" на "функции возврата".Мне не нравится "лестничный" вид моего кода.

Как вы думаете, это хорошая идея?

Я не понимаю разницы между ними (за исключением асинхронных вызовов веб-службы, которые вынуждают использовать функцию обратного вызова в моем коде).

Функция обратного вызова:

Декларация:

func methodToSelectData(strQuery : String, dataBase: String, completion: @escaping (_ result: [AnyObject]) -> Void) {
    let arryToReturn : [AnyObject] = []

    let contactDB = FMDatabase(path: String(methodToCreateDatabase(dataBase: dataBase)!.absoluteString) )

    if (contactDB?.open())! {
        let results:FMResultSet? = contactDB?.executeQuery(strQuery, withArgumentsIn: nil)

        while results?.next() == true {
            arryToReturn.add(results!.resultDictionary())
        }

        if arryToReturn.count == 0 {
            completion(arryToReturn)
        }

        contactDB?.close()
    } else {
        print("Error: \(String(describing: contactDB?.lastErrorMessage()))")
    }
    completion(arryToReturn)
}

Использование:

DBHandler.sharedInstance.methodToSelectData(strQuery:"SELECT * FROM table", dataBase: "DB.db", completion: { resultQuery in
    if (resultQuery.count > 0) {
        ...
    }
})  

Функция возврата

Декларация:

func method2ToSelectData(strQuery : String, dataBase: String) -> [AnyObject] {
    let arryToReturn : [AnyObject] = []

    let contactDB = FMDatabase(path: String(methodToCreateDatabase(dataBase: dataBase)!.absoluteString) )

    if (contactDB?.open())! {
        let results:FMResultSet? = contactDB?.executeQuery(strQuery, withArgumentsIn: nil)

        while results?.next() == true {
            arryToReturn.add(results!.resultDictionary())
        }

        if arryToReturn.count == 0 {
            return arryToReturn
        }

        contactDB?.close()
    } else {
        print("Error: \(String(describing: contactDB?.lastErrorMessage()))")
    }

    return arryToReturn
}  

Использование:

let resultQuery =  DBHandler.sharedInstance.method2ToSelectData(strQuery:"SELECT * FROM table", dataBase: "DB.db")

if (resultQuery.count > 0) {
    ...
}

Каков наилучший способ использования одного илиДругой?Я не очень хорошо понимаю эту тонкость.

1 Ответ

0 голосов
/ 21 мая 2019

Это действительно вопрос того, что вам нужно в любой конкретной ситуации.

Для такой простой вещи, как возврат части данных, вы можете сделать это:

// Definition //
func newString(firstHalf: String, secondHalf: String) -> String {
    return firstHalf + secondHalf
}

// Usage //
print(newString(firstHalf: "Hello", secondHalf: "world"))

Что-то более сложное, например, вызов данных, может нуждаться в обработчике завершения или закрытии:

// Definition //
func getData(fromEndpoint endpoint: String, completion: (String) -> Void) {
    let data = serverData(from: endpoint) //Makes the server request.
    completion(data)
}

// Usage //
getData(fromEndpoint: "https://www.reddit.com/.json") { data in
    doThings(with: data)
}

Вам не обязательно нужен асинхронный вызов для использования замыкания / обратного вызова, но он, как правило, является одним из наиболее распространенных вариантов использования для одного. По мере того, как вы будете больше программировать в Swift, вы найдете больше вариантов использования для каждого.

...