Блоки Objective-C и переменная область - PullRequest
3 голосов
/ 23 февраля 2012

Я бы хотел установить значение объекта NSData в моем блоке. Может кто-нибудь дать мне знать, что я здесь сделал неправильно?

// Data
__block NSData *data = nil;

[ZSURLConnection performRequestWithUrl:wsdlURL xmlString:xml completionHandler:^(NSData *response, NSError *error) {

    // Handle the error
    if (error) {
        NSLog(@"Error: %@", [error localizedDescription]);
    } else {
        data = response;
    }//end

}];//end block

if (data) {
    NSString *d = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    NSLog(@"DATA --- %@", d);
}

return data;

Почему я не могу присвоить ответ data, а затем получить его за пределами моего блока?

Ответы [ 2 ]

7 голосов
/ 23 февраля 2012

Поскольку блок работает асинхронно, после остальной части вашего метода. Либо перепишите свой вызывающий код для работы с асинхронной загрузкой, либо найдите способ выполнить работу блока синхронно. Я не знаю, что такое ZSURLConnection, но проверьте, есть ли у него версия метода "execute ...", который не работает в фоновом режиме.

3 голосов
/ 23 февраля 2012

performRequestWithUrl:xmlString:completionHandler: не является синхронным методом. Он устанавливает асинхронный запрос и сразу же возвращается. Остальная часть вашего метода запускается и возвращает.

Когда запрос завершается, только тогда он запускает ваш блок, который присваивает data, а затем сразу же выбрасывает его.

Если бы это был синхронный метод, ваша процедура блокировала бы ожидание дорогостоящей сетевой операции. Если бы это было в главном потоке, все ваше приложение зависло бы. ZSURLConnectionNSURLConnection) разработан, чтобы этого избежать.

...