在 Swift 中使用 AFNetworking 接收响应

Posted

技术标签:

【中文标题】在 Swift 中使用 AFNetworking 接收响应【英文标题】:Receiving response using AFNetworking in Swift 【发布时间】:2016-01-08 04:48:21 【问题描述】:

我是 AFNetworking 的新手,我正在尝试遵循 Raywenderlich 的教程。所以我得到了JSON 解析的代码,我正在努力将其转换为Swift。我尝试了很多教程和 *** 答案,但找不到一个很好的解释。

- (IBAction)jsonTapped:(id)sender

    // 1
    NSString *string = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString];
    NSURL *url = [NSURL URLWithString:string];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 2
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 

        // 3
        self.weather = (NSDictionary *)responseObject;
        self.title = @"JSON Retrieved";
        [self.tableView reloadData];

     failure:^(AFHTTPRequestOperation *operation, NSError *error) 

        // 4
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                            message:[error localizedDescription]
                                                           delegate:nil
                                                  cancelButtonTitle:@"Ok"
                                                  otherButtonTitles:nil];
        [alertView show];
    ];

    // 5
    [operation start];

那么,任何人都可以帮助我了解使用AFNetworking 解析数据的基础知识吗?

【问题讨论】:

【参考方案1】:

问题是你为什么要在Swift 中使用Objc。有很多框架可以替代AFNetworking

其实是同一个开发者在Swift开发了网络库,命名为Alamofire

您可以使用该框架并获得相同的响应:

这是它的演示示例!

func postWebserviceWithURL(strUrl: String, param: NSDictionary?, completionHandler: (NSDictionary?, NSError?) -> ()) -> ()

        Alamofire.request(.POST, strUrl, parameters: param as? [String : AnyObject], encoding: ParameterEncoding.URL).responseJSON  response in

            switch response.result 

            case .Success(let data):
                let json = data as? NSDictionary
                completionHandler(json, nil)
            case .Failure(let error):
                completionHandler(nil, error)
                self.showSingleAlert("app_name", message: error.localizedDescription)
            
        
    

【讨论】:

那么它提供的功能和AFNetworking一样吗? 当然,几乎一样。你只需要确定它的方法,你就可以开始了! @KamalaDash 另一个问题,如果我们选择 NSUrlSession 和默认网络类而不是第 3 方,尤其是 Alamofire/AFNetworking,有什么优势? 据我所知,NSURLSession 是最好的,因为它是原生的。但问题是您会收到比其他 3rd 方库慢的响应。 @KamalaDash 为了更快,你可以使用dispatch_async(dispatch_get_main_queue()) @KamalaDash【参考方案2】:

是的,您可以快速轻松地使用 AFnetworking 库来创建 Bridging-Header.h 文件并将 AFNetworking.h 导入您的 Bridging-Header.h 文件

并在您的 json 方法中尝试以下代码

let urlAsString = "<Your json URL in string>"   
        let manager = AFHTTPRequestOperationManager()
        manager.POST(
            urlAsString,
            parameters: <Parameter>,
            success:  (operation: AFHTTPRequestOperation!,
                responseObject: AnyObject!) in
print("JSON: " + responseObject.description)
,
failure:  (operation: AFHTTPRequestOperation!
    error: NSError!) in
  
 )

【讨论】:

以上是关于在 Swift 中使用 AFNetworking 接收响应的主要内容,如果未能解决你的问题,请参考以下文章

在swift ios中使用AFNetworking上传图片

如何在 swift 中避免由于 AFNetworking 导致的内存泄漏

使用 Swift 从 AFNetworking 访问 JSON 数据

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

使用 AFNetworking 的 Swift 3

Swift 中 AFNetworking 2.0 中的 Web 服务调用问题