2015-03-06 2 views
0

Интересно, можно ли объявить/передать 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 бы быть в состоянии сделать следующие Getting ошибки

[mapView pinItems:items shouldFetchSingleItem:^(NSInteger itemID, FetchItemCompletion fetchItemCompletion) { 
     // request to API or whatever 
     id item = ... 
     fetchItemCompletion(item); 
    } 

:

enter image description here

Возможно ли это каким-то образом и что политика памяти для этого? Есть ли узкие места или любые другие возможные проблемы.

Примечание: оценил ответ на исходный вопрос, а не об образце потребительной случае

ответ

0

нуждается в вашей второй ЬурейеЕ быть объявлен как

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

Вам не нужно переобъявить какие параметры вашего блока если вы используете его как тип после его typedef.

+0

omg ... вид орфографической ошибки, поэтому он работает так, как ожидалось, никогда не использовал блоки, подобные этому. Спасибо – Injectios

Смежные вопросы