Добавление обратного вызова к функции класса в Swift

В моем проекте я создал общедоступный класс для обработки моего сетевого интерфейса для запросов данных (JSON, изображения и т. д.). Функция внутри класса использует Alamofire для установления сетевого подключения и загрузки файла JSON.

Класс и функция ниже:

import Foundation
import Alamofire

public class DataConnectionManager {

    public class func getJSON(AppModule:String, callback:(Int) -> Void) -> Void {

        switch(AppModule) {

        case "Newsfeed":
            Alamofire.request(.GET, "http://some-site.com/api/", encoding: .JSON).responseJSON { (_, _, JSONData, _) in
                if JSONData != nil {
                    jsonHolder.jsonData = JSONData!
                    print("start")
                    callback(1)
                }
                else {
                    callback(0)
                }
            }
            break

        default:
            break

        }

    }

}

Я вызываю функцию в своем проекте, как показано ниже:

DataConnectionManager.getJSON("Newsfeed", callback: { (intCheck : Int) -> Void in
    if intCheck == 1 {
        println("Success")
    }
    else {
        println("Failure")
    }  
})

Приложение запускается без каких-либо ошибок, однако мои проверки работоспособности не распечатываются. На самом деле, когда я делаю это таким образом, Alamofire.request также не захватывает канал JSON.

Я иду в правильном направлении с этим?


person matcartmill    schedule 12.01.2015    source источник
comment
Вы пытались отладить его? Это попадало в новостную ленту?   -  person Lucas Huang    schedule 13.01.2015
comment
Просто из соображений стиля не используйте заглавные буквы для имен переменных. JSONData выглядит как тип, тогда как jsonData выглядит как переменная. Я знаю, что это немного двусмысленно в случае переменной, которая начинается с аббревиатуры, но Swift, в большей степени, чем большинство языков, имеет ВСЕ типы в верхнем регистре и ВСЕ переменные в нижнем регистре.   -  person exists-forall    schedule 13.01.2015
comment
Вы выбрасываете ошибку из responseJSON, если она есть. Попробуйте разобрать его вместо (_, _, JSONData, error) if error != nil.   -  person Ian MacDonald    schedule 13.01.2015
comment
Вы должны обернуть свой URL-адрес в NSURL, а не просто вводить строку.   -  person Steven Ritchie    schedule 13.01.2015
comment
Еще одно замечание: операторы break излишни. Swift ломается автоматически. Вам нужно fallthrough, чтобы получить обычное C-поведение.   -  person qwerty_so    schedule 13.01.2015
comment
Спасибо за ответы, ребята. Я изменил переменную JSONData на responseData. Я также добавил часть проверки ошибок в запрос Alamo. Внезапно теперь все работает. Я понятия не имею, что было изменено, что исправило это, но.... это работает. Я добавлю свой обновленный код в качестве ответа. Если кто-то может просмотреть его и сообщить мне, если они видят очевидную причину, я был бы признателен.   -  person matcartmill    schedule 13.01.2015


Ответы (2)


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

Мой «Менеджер соединений»:

import Foundation
import Alamofire

public class DataConnectionManager {

    public class func getJSON(AppModule:String, callback:(Int) -> Void) -> Void {

        switch(AppModule) {

        case "Newsfeed":
            Alamofire.request(.GET, "http://some-site.com/api/", encoding: .JSON).responseJSON { (_, _, alamoResponse, error) in
                if (error != nil){
                    println("You've got a response error!")
                    callback(0)
                }
                else {
                    if alamoResponse != nil {
                        jsonHolder.jsonData = alamoResponse!
                        callback(1)
                    }
                    else {
                        println("You've got some random error")
                        callback(0)
                    }
                }
            }
            break

        default:
            break

        }

    }

}

Мой вызов функции:

DataConnectionManager.getJSON("Newsfeed", callback: { (intCheck : Int) -> Void in
    if intCheck == 1 {
        self.createTable()
    }
    else {
        println("Failure")
    } 
})
person matcartmill    schedule 12.01.2015

Я использую swift 2.0 + SwiftyJSON, и это мой код для реализации этого:

 class func getJSON(AppModule:String, urlToRequest: String, resultJSON:(JSON) -> Void) -> Void {
    var returnResult: JSON = JSON.nullJSON

    switch(AppModule) {
    case "all":
        request(.GET, urlToRequest)
            .responseJSON { (_, _, result) in
            if (result.isFailure){
                print("You've got a response error!")
                resultJSON(nil)
            }
            else {
                if (JSON(result.value!) != nil) {
                    returnResult = JSON(result.value!)
                    resultJSON(returnResult)
                }
                else {
                    print("You've got some random error")
                }
            }
        }
        break

    default:
        break

    }

}

И вызовите функцию следующим образом:

    DataManager.getJSON("all",urlToRequest: "myurl.com", resultJSON: { (result: JSON) -> Void in
        if (result == nil){
            // error with result json == nil
            return
        }else{
            //do something with json result
        }
    })

Надеюсь, это может быть полезно.

person Dasoga    schedule 09.09.2015