Можно ли использовать метод вместо блока? - PullRequest
2 голосов
/ 20 декабря 2011

В 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)
 ];

Или еще что-нибудь.

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

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

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

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

1 голос
/ 20 декабря 2011

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

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

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

1 голос
/ 20 декабря 2011

Неа. Если метод принимает блок в качестве своего обработчика, вам нужно дать ему блок. Почему?

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

...