iBeacon: didRangeBeacons перестает вызываться, необходимо перезагрузить устройство, чтобы оно снова заработало

Поскольку матовый указывает, Alamofire возвращает данные асинхронно через шаблон completionHandler, поэтому вы должны сделать то же самое. Вы можете не просто return значение сразу, но вместо этого вы хотите использовать возвращаемый тип Void и вместо этого использовать шаблон закрытия обработчика завершения.

В Swift 3 и Alamofire 4 это может выглядеть так:

func getOrders(completionHandler: @escaping (NSDictionary?, Error?) -> ()) {
    makeCall("orders", completionHandler: completionHandler)
}

func makeCall(_ section: String, completionHandler: @escaping (NSDictionary?, Error?) -> ()) {
    let params = ["consumer_key":"key", "consumer_secret":"secret"]

    Alamofire.request("\(apiUrl)/\(apiEndPoint + section)", parameters: params)
        .authenticate(user: consumerKey, password: consumerSecret)
        .responseJSON { response in
            switch response.result {
            case .success(let value):
                completionHandler(value as? NSDictionary, nil)
            case .failure(let error):
                completionHandler(nil, error)
            }
    }
}

Затем, когда вы хотите вызвать его, вы используете этот параметр completionHandler (если хотите, в закрытии закрытия):

let api = API()
api.getOrders() { responseObject, error in
    // use responseObject and error here

    print("responseObject = \(responseObject); error = \(error)")
    return
}

// but don't try to use them here
13
задан Patrick 9 April 2014 в 06:04
поделиться