Загрузить изображение с URL-адреса в iPhone, только если оно маленькое

Я использую initWithContentsOfURL из NSData для загрузки изображения с URL-адреса. Однако я заранее не знаю размер изображения, и я хотел бы, чтобы соединение останавливалось или терпело неудачу, если ответ превышает определенный размер.

Есть ли способ сделать это в iPhone 3.0?

Заранее спасибо.


person hpique    schedule 23.07.2009    source источник


Ответы (1)


Вы не можете сделать это напрямую через NSData, однако NSURLConnection поддерживает такую ​​возможность, загружая изображение асинхронно и используя connection:didReceiveData:, чтобы проверить, сколько данных вы получили. Если вы превысите лимит, просто отправьте сообщение cancel в NSURLConnection, чтобы остановить запрос.

Простой пример: (receivedData определяется в заголовке как NSMutableData)

@implementation TestConnection

- (id)init {
    [self loadURL:[NSURL URLWithString:@"http://stackoverflow.com/content/img/so/logo.png"]];
    return self;
}

- (BOOL)loadURL:(NSURL *)inURL {
    NSURLRequest *request = [NSURLRequest requestWithURL:inURL];
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];

    if (conn) {
        receivedData = [[NSMutableData data] retain];
    } else {
        return FALSE;
    }

    return TRUE;
}

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response {
    [receivedData setLength:0]; 
}

- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data {
    [receivedData appendData:data];

    if ([receivedData length] > 5120) { //5KB
        [conn cancel];
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)conn {
    // do something with the data
    NSLog(@"Succeeded! Received %d bytes of data", [receivedData length]);

    [receivedData release];
}

@end
person Travis Watkins    schedule 23.07.2009
comment
Правильно, это единственный способ сделать это на уровне Cocoa на iPhone. Обратите внимание, что это асинхронно, тогда как исходный код синхронен. Асинхронный почти всегда лучше, но к другому подходу нужно привыкнуть. - person Mike Abdullah; 23.07.2009