Изображение пустое при использовании NSURLConnection, но не при использовании dataWithContentsOfURL - PullRequest
0 голосов
/ 28 июня 2011

Когда я использую NSURLConnection асинхронно, чтобы попытаться получить NSData с моими данными изображения, изображение возвращается пустым, но когда я использую dataWithContentsOfURL синхронно, у меня нет проблем, и я правильно получаю данные изображения , Есть ли какая-то причина, по которой мой асинхронный метод потерпит неудачу?

Это работает:

NSData *data = [NSData dataWithContentsOfURL: url];
NSLog(@"TEST %@", data);
UIImage *map = [UIImage imageWithData:data];
mapView.image = map;

Это не:

//
//  MapHttpRequest.m
//  GTWeb
//
//  Created by Graphic Technologies on 6/21/11. 
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "MapHttpRequest.h"

@implementation MapHttpRequest
@synthesize receivedData;
@synthesize dataString;
@synthesize vc;

- (void)request:(NSString *)url fromView:(UIViewController *) theVC
{
vc = theVC;
// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:url]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:60.0];
NSLog(@"URL: %@", url);
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse             *)response
{
// This method is called when the server has determined that it
// has enough information to create the NSURLResponse.

// It can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.

// receivedData is an instance variable declared elsewhere.
[receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// release the connection, and the data object
[connection release];
// receivedData is declared as a method instance elsewhere
[receivedData release];

// inform the user
NSLog(@"Connection failed! Error - %@ %@",
      [error localizedDescription],
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// do something with the data
// receivedData is declared as a method instance elsewhere

[vc mapImageConnectionFinished:receivedData];

// release the connection, and the data object
[dataString release];
[connection release];
[receivedData release];
}

@end

Ответы [ 3 ]

0 голосов
/ 29 июня 2011

Согласно вашему коду, вы не запланировали запуск соединения:

[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start];

Вы поместили следы в обратные вызовы вашего делегата, чтобы убедиться, что они вызывают?

0 голосов
/ 30 июня 2011

Оказывается, это дало мне неверный запрос, потому что был невидимый возврат каретки или пробел. Обрезать его с помощью:

url = [url stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

исправил мои проблемы.

0 голосов
/ 28 июня 2011

Похоже, вы начали смотреть на руководство по http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html, но не дочитали его до конца:)

Вам необходимо реализовать методы, которые будут получать информацию о полученных данных.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

Это все описано в ссылке, которую я предоставил.

...