在 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 中避免由于 AFNetworking 导致的内存泄漏
使用 Swift 从 AFNetworking 访问 JSON 数据