2013-11-15 3 views
0

Вот проблема, я использую http-запрос, но когда я использую NSURLConnection, чтобы получить свой xml-файл и установить переменную NSString * xml с этим xml-файлом, я получаю ошибку указателя блока, если я вернусь Это. Но если я возьму NSString * xml и отправлю его методу, он ничего мне не говорит, и переменная xml хорошо установлена. Также, если я верну в конце моего метода переменную, я получаю нуль при родительском методе вызова. Как я могу это исправить, потому что требуется возврат переменной. Спасибо за любую помощь, а вот мой код: Ошибка:Ошибка NSURLConnection и указателей

incompatible block pointer types sending 'NSString *(^)NSURLResponse *, NSData *, NSError *)'to parameter of type 'void(^)(NSURLResponse *,NSData *, NSError *)' 

- (NSString *)restTestRequester: (NSString *)uriRequested serviceUri:(NSString *)sUri parameters:(NSString *)uriParameters technique:(NSString *)requestTechnique { 

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSString *l_api_key = [prefs stringForKey:@"globalPublicK"]; 
    NSString *l_secret_key = [prefs stringForKey:@"globalSecretK"]; 

    l_uri = [NSString stringWithFormat:@"%@/%@", uriRequested, sUri]; 

    NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:l_uri] 
                  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                 timeoutInterval:60.0]; 

    [theRequest setHTTPMethod:requestTechnique]; 
    [theRequest setValue:@"application/xml" forHTTPHeaderField:@"Accept"]; 
    [theRequest setValue:@"application/x-www-form-unrlencoded" forHTTPHeaderField: @"Content-Type"]; 
    [theRequest setValue:l_api_key forHTTPHeaderField: @"EMApikey"]; 
    [theRequest setValue:[self hmacsha1:l_uri secret:l_secret_key] forHTTPHeaderField: @"EMRequestHash"]; 
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if(theConnection) 
    { 

     [NSURLConnection sendAsynchronousRequest:theRequest 
              queue:[NSOperationQueue mainQueue] 
     incompatible block pointer types error--> completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
     { 
    here ---->xml = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] 
           autorelease]; 
     works--->[self myMethod:xml]; 
     doesn't work---> return(xml); 
     } 
     ]; 
    } 
    else 
    { 
     NSLog(@"theConnection is NULL"); 
    } 

    [theConnection release]; 
    equals nil variable returned-->return xml; 
} 
+0

Вы не используете ARC? – Holly

+0

Нет дуги, почему это источник проблемы? –

+0

Я верю, что переменная xml не сохраняет правильно создать переменную экземпляра с помощью setter и getter и проверить? –

ответ

-1

Я думаю, что проблема заключается в асинхронном вызове, U до сих пор не имеет ничего XML, когда U TRIE, чтобы вернуть его, ваш метод возвращается до завершения отправки.

ПРИМЕНЕНИЕ:

NSData* data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString* xml = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

Он будет ждать, пока U не получите результат обратно.

-1

У вас есть несколько серьезных проблем. Для начала ваш блок выполняется после завершения соединения. Код после выполнения блока после подключения STARTS. Это означает, что вы освобождаете соединение до его завершения.

Кроме того, вы создаете NSURLConnection *theConnection, но никогда не используете его. Когда вы вызываете -sendAsynchronousRequest:queue:completionHandler:, он создает совершенно новый обработчик.

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

NSURL *targetURL = [NSURL URLWithString:l_uri]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:targetUrl            
                  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                 timeoutInterval:60.0]; 

[theRequest setHTTPMethod:requestTechnique]; 
[theRequest setValue:@"application/xml" forHTTPHeaderField:@"Accept"]; 
[theRequest setValue:@"application/x-www-form-unrlencoded" forHTTPHeaderField: @"Content-Type"]; 
[theRequest setValue:l_api_key forHTTPHeaderField: @"EMApikey"]; 
[theRequest setValue:[self hmacsha1:l_uri secret:l_secret_key] forHTTPHeaderField: @"EMRequestHash"]; 
[NSURLConnection sendAsynchronousRequest:theRequest 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     // Here the connection is complete and the data is usable. 
     NSString *xml = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     [self myMethod:xml]; 
     [xml release]; 
    }]; 
// Here the Connection has only been queued and no data is available. 
Смежные вопросы