在方便的方法中包装基于块的 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在基于块的 API 方法中使用非空和可为空的 Objective-C 关键字

如何在异步协程中包装同步函数?

如何在 C# 中包装 HttpClient 以实现可测试性

java中包装类介绍

在 try catch 中包装所有 swig 生成的方法

如何在 AppBar 中包装子小部件以获得更大的子高度和 Flutter 中的填充