4

我有一个处理Apple Push Notification Service远程通知的方法。执行此方法时,我希望它调用我的服务器并使用库执行HTTP POST请求。Alamofire我想执行另一种方法来处理 POST 请求的响应。

对我来说,问题是我API在这个 POST 请求中使用现有的从服务器获取配置文件。所以我需要使用这个现有的 API 并确定何时从远程通知专门触发了此配置文件获取。

由于Alamofire请求是在后台队列中完成的,在从服务器接收到配置文件后,我将如何执行方法?

什么是解决这个问题的好选择?

谢谢!

4

3 回答 3

4

由于 Alamofire 请求是在后台队列中完成的,在从服务器接收到配置文件后,我将如何执行方法?

响应处理内置于 Alamofire。你可以做这样的事情(改编自文档):

Alamofire.request(.POST, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .response { (request, response, data, error) in
                     println(request)
                     println(response)
                     println(error)
                   }

注意.response方法调用,它将完成处理程序添加到请求对象;当请求完成(或失败)时,Alamofire 会调用完成处理程序。

于 2015-01-05T01:16:17.867 回答
1

从您的问题表述中不清楚您要解决什么问题。但是您已经在上面的问题评论中阐明了您的意图。

正如我现在理解的问题一样,您有一些代码可以更新服务器上的配置文件并处理服务器的响应。该代码在两种情况下调用,一种由用户手动请求启动,另一种由推送通知启动。在第一种情况下,您不想在处理来自服务器的响应后生成警报,但在第二种情况下您会这样做。

您确实有一个闭包,您可以使用它来处理不同的行为,即使差异发生在进程的异步部分。这是一个可能看起来如何的草图(不是实际的工作代码):

func updateProfile(parameters: [String:String], showAlert: Bool) {
    Alamofire.request(.POST, "http://myserver.com/profile", parameters: parameters)
             .response { (request, response, data, error) in
                         if (error == nil) {
                           processProfileResponse(response)
                           if showAlert {
                             showProfileWasUpdatedAlert()
                           }
                         }
                   }      

}

注意showAlert传递给updateProfile方法的参数。如果你传入,它会在收到服务器的响应后true调用该方法来显示你的警报。showProfileWasUpdatedAlert请注意,这个布尔值被处理 Alamofire 响应的闭包“捕获”,因为闭包是在updateProfile函数内部定义的。

恕我直言,这比在 AppDelegate 中声明一个全局应用程序更好。

于 2015-01-09T22:49:58.607 回答
1

干得好

func AlamofireRequest(method: Alamofire.Method, URLString: URLStringConvertible, parameters: [String : AnyObject]?, encoding: ParameterEncoding, headers: [String : String]?) -> Alamofire.Result<String>? {
    var finishFlag = 0
    var AlamofireResult: Alamofire.Result<String>? = nil
    Alamofire.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers)
        .responseString { (_, _, result) -> Void in
            if result.isSuccess {
                finishFlag = 1
                AlamofireResult = result
            }
            else {
                finishFlag = -1
            }
    }
    while finishFlag == 0 {
        NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture())
    }
    return AlamofireResult
}
于 2015-09-17T13:06:59.370 回答