我想知道是否有可能声明/传递block
为another的参数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);
}
遇到错误:
这可能会以某种方式发生吗,对此有什么存储策略?是否有任何瓶颈或任何其他可能的问题。
注意:对于原始问题的赞赏答案,而不是关于示例用例的答案
您的第二个typedef需要声明为
typedef void(^ShouldFetchSingleItem)(NSInteger itemID, FetchItemCompletion fetchItemCompletion);
在您对代码块进行类型定义后,无需重新声明该代码块将使用哪些参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句