阻止作为块的参数

时间:2015-03-06 15:04:54

标签: ios block

我想知道是否可以声明/传递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);
    }

获取错误:

enter image description here

这可能是某种方式,这是什么内存政策?是否有任何瓶颈或任何其他可能的问题。

注意:赞赏原始问题的答案,而不是样本用例

1 个答案:

答案 0 :(得分:0)

您的第二个typedef需要声明为

typedef void(^ShouldFetchSingleItem)(NSInteger itemID, FetchItemCompletion fetchItemCompletion);

在键入dede后,您不需要重新声明块作为类型使用的参数。