При доступе к сети, что отличается между блоком и без блока - PullRequest
1 голос
/ 08 сентября 2011

Я использую инфраструктуру ASIHTTPRequest, в документе , в чем различия между 2-м и 3-м примером, в использовании , преимущество и недостаток ?

2-й пример (создание асинхронного запроса):

- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];

// Use when fetching binary data
NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}

3-й пример (использование блоков)

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      // Use when fetching text data
      NSString *responseString = [request responseString];

      // Use when fetching binary data
      NSData *responseData = [request responseData];
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
   }];
   [request startAsynchronous];
}

1 Ответ

1 голос
/ 08 сентября 2011

Блоки в iOS являются частью Параллельного программирования

Блок используется, когда вы хотите создать единицы работы (то есть сегменты кода), которые можно передавать, как если бы они были значениями . Блоки обычно используются для записи обратных вызовов .

Обычно использование блоков не отражается в различном поведении приложения. Синтаксическое отличие состоит в том, что при использовании блоков вам не нужно определять делегат запроса или реализовывать методы делегата (такие как -requestFinished: и -requestFailed:) для асинхронных запросов.

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

Вторым преимуществом является использование вложенных вызовов запросов. Например, вам может потребоваться выполнить несколько запросов последовательно, и без блоков вам потребуется определять отдельный обратный вызов метода делегата для каждого запроса, что может привести к снижению читабельности вашего кода.

Блоки позволяют вам писать код в точке вызова, который выполняется позже в контексте реализации метода , что может быть очень полезно, когда вы привыкнете использовать их.

Некоторые шаблоны, которых следует избегать при использовании блоков, упомянуты в Топы программирования блоков Apple

...