在方便的方法中包装基于块的 API
Posted
技术标签:
【中文标题】在方便的方法中包装基于块的 API【英文标题】:Wrapping blocks based API in convenience methods 【发布时间】:2014-06-16 22:31:10 【问题描述】:我正在使用 AFNetworking 2.0 访问 web api(尽管这也适用于 NSURLSession),目前我有一堆看起来像这样的代码:
[self.rottenTomatoesManager GET:@"movies.json" parameters:@@"q" : searchString, @"apikey" : [self.rottenTomatoesManager apiKey]
success:^(NSURLSessionDataTask *task, id responseObject)
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
if(response.statusCode == 200)
NSDictionary *responseData = responseObject;
self.searchResults = responseData[@"movies"];
[self.searchDisplayController.searchResultsTableView reloadData];
[self.tableView reloadData];
failure:^(NSURLSessionDataTask *task, NSError *error)
NSLog(@"Error loading movies %@", error.localizedDescription);
];
我想采用该功能并将其包装在一个看起来像这样的便捷方法中
NSArray *results = [self.rottenTomatoesManager searchMoviesWithTitle:@"The avengers"]
清理 ViewController 代码并使大部分代码框架不可知。
最好的方法是什么,这样我就不会将一个不错的基于异步块的 API 变成一个同步 API?
【问题讨论】:
您不想将异步 API 更改为同步 API。因为阻塞是坏的(阻塞是好的) 【参考方案1】:回调块非常适合这个。
[self loadSomethingWithCallback:^(NSArray *results)
NSLog(@"%@", results);
];
【讨论】:
我假设您随后执行了 AFNetworking 成功块内的块? 正确,您可能还想在故障块中使用空数组或 nil 运行它。 现在我在想它应该只是一个没有返回类型的块。更新该块中的表视图并从 AFNetworking 块中调用该块。 您的典型回调块接受一个对象(id)并返回 void。以上是关于在方便的方法中包装基于块的 API的主要内容,如果未能解决你的问题,请参考以下文章