Аламофайр. Дождитесь результата с сервера

У меня есть RegistrationViewController, где я хочу, чтобы пользователи регистрировали свои учетные записи. Я также создал класс взаимодействия с сервером под названием ServerInteraction.

Вот как я вызываю функцию из моего ServerInteraction для регистрации нового пользователя:

var json: JSON = ServerInteraction.registerUser(self.fullnameTextField.text, phone: self.telephoneTextField.text, password: self.passwordTextField.text, photo: self.image)

А вот объявление этой функции в классе ServerInteraction:

class func registerUser(fullname: String, phone: String, password: String, photo: UIImage?) -> JSON {
    // set request params
    var params = [
        C.register.rawValue: "true", C.registerName.rawValue: fullname, C.password.rawValue: password, C.phone.rawValue: phone, C.registerDescription.rawValue: "", C.registerType.rawValue: "Student"
    ]

    if let picture = photo {
        let imageData = UIImageJPEGRepresentation(picture, 0.2)
        let urlRequest = urlRequestWithComponents("http://host.com/addUser.php", parameters: params, imageData: imageData!)

        Alamofire.upload(urlRequest.0, data: urlRequest.1)
            .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
                println("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
            }
            .responseJSON { (_, _, data, error) in
                if error == nil {
                    // check for coming data
                    if let data: AnyObject = data {
                        // convert to json
                        let json = JSON(data)
                        dispatch_async(dispatch_get_main_queue(), {
                            return json
                        })
                    }
                } else {
                    dispatch_async(dispatch_get_main_queue(), {
                        return JSON(["error": true]) 
                    })
                }
            }
    }
}

Я хочу отправить результат JSON с сервера обратно на RegistrationViewController и использовать его там. Но компилятор говорит:

Отсутствует возврат в функции, которая, как ожидается, вернет «JSON»

в конце функции.

Затем я попытался создать переменную для хранения результата JSON, а затем вернуть его, но он всегда равен нулю, потому что сервер отвечает немного позже и возвращает нулевое значение.

class func registerUser(fullname: String, phone: String, password: String, photo: UIImage?) -> JSON {
    // set request params
    var params = [
        C.register.rawValue: "true", C.registerName.rawValue: fullname, C.password.rawValue: password, C.phone.rawValue: phone, C.registerDescription.rawValue: "", C.registerType.rawValue: "Student"
    ]
    // added a variable here
    var result: JSON!
    if let picture = photo {
        let imageData = UIImageJPEGRepresentation(picture, 0.2)
        let urlRequest = urlRequestWithComponents("http://host.com/addUser.php", parameters: params, imageData: imageData!)

        Alamofire.upload(urlRequest.0, data: urlRequest.1)
            .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
                println("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
            }
            .responseJSON { (_, _, data, error) in
                if error == nil {
                    // check for coming data
                    if let data: AnyObject = data {
                        // convert to json and set to result variable
                        result = JSON(data)
                    }
                } else {
                    // set an error to result variable
                    result = JSON(["error": true]) 
                }
            }
    }
    // nil value here
    return result 
}

Как тут дождаться результата или есть какие-то другие решения этой проблемы?


person mkz    schedule 16.09.2015    source источник
comment
Об этом спрашивали миллион раз... См. это ответ, например, но есть много других ответов, которые вы могли бы использовать. Ключевые слова: асинхронный и обработчик завершения.   -  person Eric Aya    schedule 16.09.2015
comment
Спасибо @EricD., это то, что я искал!   -  person mkz    schedule 16.09.2015