2011-12-20 2 views
2

В Objective-C можно использовать метод вместо блока?Можно ли использовать метод вместо блока?

Так, например, вместо определения блока, то вызов метода:

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) { 
          [self processTwitterSearchResponse:response data:responseData error:error]; 
         } 
]; 

вызова метода непосредственно:

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:(processTwitterSearchResponse:response data:responseData error:error) 
]; 

Или некоторые такие.

+0

Насколько сложно создать блок, который вызывает метод? – gnasher729

ответ

1

Nope. Если метод берет блок в качестве обработчика, вам нужно дать ему блок. Зачем?

Есть некоторые методы, которые принимают указатели на функции, а не блоки, как NSArray-х -sortedArrayUsingFunction:context: (в отличие от блока на основе -sortedArrayUsingComparator:), но вы определенно не можете просто поменять в методе подписи, где он ожидает блок.

+0

Большое спасибо за подробный ответ с примерами! –

1

Одним словом, нет.

Если метод ожидает блок, это то, что вы должны ему дать.

Один из способов понять это: блокирует состояние захвата (значения переменных) из места (лексической области), где они определены, позволяя этому состоянию передаваться другому потоку для отложенного выполнения. Вот почему они не взаимозаменяемы с указателем функции; есть дополнительная информация, переносимая вместе с блоком.

1

Это разумный вопрос, просто чтобы добавить немного к уже указанным ответам.

Если вы посмотрите на метод, который непосредственно принимает другой метод в качестве аргумента, вы заметите, что он также принимает дополнительный аргумент, объект для вызова метода. Посмотрите на пример вашего блока, и вы увидите, что он ссылается на self, поэтому ваш блок предоставляет одну и ту же пару значений - метод и объект.

Нет абсолютно никакой причины, по которой Objective-C не может иметь конструкцию, которая взяла объект и метод, скажем @block(object, method) или даже просто просто object.method, и вернул блок, но он не имеет. Если вы знакомы с C#, вы узнаете, что у него есть такая конструкция для создания делегата , который является его версией блока.

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