使用Alamofire

时间:2016-09-06 12:59:28

标签: ios swift http alamofire charles-proxy

我的iOS应用程序向我们的API执行HTTP请求时出现问题。此请求的问题是通常需要30-40秒才能完成。我现在不需要处理响应,所以我只需要解雇它而忘记它。 我不知道问题是在我的代码中还是在服务器中,这就是我在这里问的原因。

我使用 Alamofire Swift 2.2 ,所有其他请求都运行正常。当我尝试调试它时,这是来自 Charles代理的屏幕截图:Charles screenshot

如您所见,阻止其他请求的请求是refreshchannels。当该请求触发(#6 #25 )时,其他请求将被阻止,并且在refreshchannels完成之前不会完成。

以下是触发该请求的代码以及我在Alamofire之上构建的APIManager:

// This is the method that gets called when the user enables the notifications in the AppDelegate class
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    // Recieve the APNSToken and handle it. I've removed it to make it shorter

    // This sends a POST to our API to store some data
    APIManager().registerForPushNotifications(parametersPush) { (result) in
        switch result {
        case .Success (let JSON):
            // This is the slow call that blocks the other HTTP requests
            APIManager().refreshChannels { _ in } // I don't need to handle the response for now
        case .Failure: break
        }
    }
}

经理:

//This is my custom manager to handle all the networking inside my app
class APIManager {

    typealias CompletionHandlerType = (Result) -> Void

    enum Result {
        case Success(AnyObject?)
        case Failure(NSError)
    }

    let API_HEADERS = Helper.sharedInstance.getApiHeaders()
    let API_DOMAIN = Helper.sharedInstance.getAPIDomain()

    //MARK: Default response to a request
    func defaultBehaviourForRequestResponse(response: Response<AnyObject, NSError>, completion: CompletionHandlerType) {
        print("Time for the request \(response.request!.URL!): \(response.timeline.totalDuration) seconds.")
        switch response.result {
        case .Success (let JSON):
            if let _ = JSON["error"]! {
                let error = NSError(domain: "APIError", code: response.response!.statusCode, userInfo: JSON as? [NSObject : AnyObject])
                completion(Result.Failure(error))
            } else {
                completion(Result.Success(JSON))
            }
        case .Failure (let error):
            completion(Result.Failure(error))
        }
    }

    func refreshChannels(completion: CompletionHandlerType) {
        Alamofire.request(.PUT, "\(API_DOMAIN)v1/user/refreshchannels", headers: API_HEADERS).responseJSON { response in
            self.defaultBehaviourForRequestResponse(response, completion: completion)
        }    
    }
}

任何帮助将不胜感激。祝你有愉快的一天!

0 个答案:

没有答案