我想知道是否可以声明/传递block
作为另一个block
的参数。
让我通过代码和简单(非真实)用例来说明:
ViewController
通过items
ItemsAPI
ViewController
希望在mapView
上显示引脚
点击(选中)mapView
引脚时:
MapView
显示项目应该请求项目详细信息mapView
更新其标注或其他现在代码:
// MapView.h
typedef void(^FetchItemCompletion)(id item);
typedef void(^ShouldFetchSingleItem)(NSInteger itemID, FetchItemCompletion(id item));
@interface MapView : MKMapView
- (void)pinItems:(NSArray *)items shouldFetchSingleItem:(ShouldFetchSingleItem)shouldFetchSingleItem;
@end
实施
- (void)pinItems:(NSArray *)items shouldFetchSingleItem:(ShouldFetchSingleItem)shouldFetchSingleItem {
// For simplifying I'm using one method instead publishing mapViewDelegate and assigning blocks to self
// 1) Pin items
// 2) Some item seleceted - aka didSelectAnnotation
// 3) We need to define WHAT WILL HAPPNED when we get item details
FetchItemCompletion fetchItemCompletion = ^void(id item) {
// update callout or whatever
};
// 4) Request for item details with fake id - 1
shouldFetchSingleItem(1, fetchItemCompletion);
// 5) ViewController should fetch item thorough API and then execute block (simply some mapView code)
}
这样ViewController就可以执行以下操作
[mapView pinItems:items shouldFetchSingleItem:^(NSInteger itemID, FetchItemCompletion fetchItemCompletion) {
// request to API or whatever
id item = ...
fetchItemCompletion(item);
}
获取错误:
这可能是某种方式,这是什么内存政策?是否有任何瓶颈或任何其他可能的问题。
注意:赞赏原始问题的答案,而不是样本用例
答案 0 :(得分:0)
您的第二个typedef需要声明为
typedef void(^ShouldFetchSingleItem)(NSInteger itemID, FetchItemCompletion fetchItemCompletion);
在键入dede后,您不需要重新声明块作为类型使用的参数。