Возврат ответа Alamofire из функции - PullRequest
0 голосов
/ 24 февраля 2020
func getStoriesNF () -> [String:Any] {

        let parameters: Parameters = ["user_id": userID]

        Alamofire.request("https://example.com/stories.php", method: .post, parameters: parameters).validate().responseJSON { response in
            switch response.result {
            case .success:
                if let json = response.result.value {

                    if let data = try JSONSerialization.jsonObject(with: json as Data, options: .allowFragments) as? [String:Any] {

                        return data

                    }
                }
            }
        }
    }

enter image description here

У меня ошибка Invalid conversion from throwing function of type '(_) throws -> _' to non-throwing function type '(DataResponse<Any>) -> Void'.

Как вернуть данные из этой функции?

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

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

     typealias CompletionHandler = ([String:Any]? , Error?) -> ()
    func getStoriesNF (completion: @escaping CompletionHandler)  {

        let parameters: Parameters = ["user_id": userID]

        Alamofire.request("https://example.com/stories.php", method: .post, parameters: parameters).validate().responseJSON { response in
            switch response.result {
            case .success:
                if let json = response.result.value {

                    if let data = try JSONSerialization.jsonObject(with: json as Data, options: .allowFragments) as? [String:Any] {

                        completion(data, nil)
                    }
                }
            }
        }
    }
0 голосов
/ 24 февраля 2020

Основная проблема в том, что Alamofire.request является асинхронным вызовом, поэтому вам нужно будет использовать обработчик завершения, например,

func getStoriesNF (completion: @escaping ([String : Any]?, Error?) {

    let parameters: Parameters = ["user_id": userID]

    Alamofire.request("https://example.com/stories.php", method: .post, parameters: parameters).validate().responseJSON { response in
        switch response.result {
        case .success:
            if let json = response.result.value {
                do {
                    if let data = try JSONSerialization.jsonObject(with: json as Data, options: .allowFragments) as? [String:Any] {
                        completion(data, nil)
                } catch (let error) {
                    completion(nil, error)
                }
            }
        }
    }
}

JSONSerialization.jsonObject должен содержаться в блоке try-catch так как это бросок

0 голосов
/ 24 февраля 2020

Можете ли вы попробовать приведенный ниже код и посмотреть, работает ли он?

Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default)
        .responseJSON { response in
            switch response.result {
        case .success:
            if let json = response.result.value {

                if let data = try JSONSerialization.jsonObject(with: json as Data, options: .allowFragments) as? [String:Any] {

                    completion(data, nil)
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...