Блоки Objective-C и переменная область видимости

Я хотел бы установить значение объекта 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, а затем получить его за пределами моего блока?


person Nic Hubbard    schedule 23.02.2012    source источник


Ответы (2)


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

person Jonathan Grynspan    schedule 23.02.2012
comment
Значит, нет способа сделать оболочку для такого запроса, который возвращает объект NSData? Мне всегда придется использовать делегата? - person Nic Hubbard; 23.02.2012
comment
Если вы создаете оболочку, вам нужно будет запустить ее в фоновом потоке, поскольку вы не можете заблокировать основной поток. В большинстве случаев это менее эффективно и так же много кода. Какую проблему ты пытаешься решить? - person Rob Napier; 23.02.2012

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

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

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

person Rob Napier    schedule 23.02.2012