iPhone изображение сохранить от веб-проблем - PullRequest
1 голос
/ 06 октября 2011

У меня есть код, который проверит, находится ли изображение на телефоне или нет (имя, полученное из БД), и если нет, он запускает этот код:

NSString *urlString = [NSString stringWithFormat: @"http://www.vegashipster.com/%@",image_path];                        
NSData *imageData = [[NSData alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]];

NSLog(@"saving jpg");
UIImage *image = [[UIImage alloc] initWithData:imageData];//1.0f = 100% quality

[UIImageJPEGRepresentation(image, 1.0f) writeToFile:myFilePath atomically:YES];
NSLog(@"saving image done");
NSLog(@"URL String: %@",urlString);
NSLog(@"http://www.vegashipster.com/%@",image_path);

rest_image = [UIImage imageNamed:image_path];

[image release];
[imageData release];

Этот кодна симуляторе работает нормально, но на айфоне экран зависает на несколько секунд (загрузка изображения, я думаю), затем загружает страницу, но изображение не видно.В следующий раз, когда вы нажмете на эту страницу, нет остановки.Поэтому я считаю, что файл создается, но это испорченный файл изображения, и поэтому он не отображается.

Я уже разбил этот код, чтобы он работал в своем собственном потоке, и снова он работаетв симуляторе.Я думал, что если бы он работал за кулисами, было бы меньше шансов, что данные изображения будут испорчены, но происходит точно так же (минус замораживание).Кто-нибудь знает, что я делаю не так с этим кодом?Спасибо за любую помощь и комментарии.

Редактировать

И да, загружаемые изображения строго .jpg

Редактировать 2

Я видел:

Убедитесь, что вы пишете в каталог DOCUMENTS, к которому у вас есть права на чтение и запись.В противном случае вы не получите никаких файлов.

при http://www.iphonedevsdk.com/forum/iphone-sdk-development/15628-file-weirdness-files-written-disk-do-not-appear-nsfilemanager-defaultmanager.html.Может ли это быть моей проблемой?

NSString *image_path = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)] stringByReplacingOccurrencesOfString:@"../"
NSString *myFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:image_path];

Последнее редактирование

Ну, я нашел то, что я считаю своим ответом на Как я могу получить доступный для записипуть на айфон? .Это в значительной степени заявляет, что я не могу сохранить файлы изображений, где мои собственные файлы изображений находятся внутри сборки.Если это неправильно, пожалуйста, дайте мне знать, и я попробую ваш путь.

Ответы [ 2 ]

1 голос
/ 06 октября 2011
NSData *imageData = [[NSData alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]];

Это синхронный вызов, то есть он блокируется до его полного выполнения, что в случае сетевых операций может составлять 1 секунду, 10 секунд или 3 минуты, если у вас нет времени ожидания.Вы, вероятно, запускаете это в главном потоке, поэтому ваш пользовательский интерфейс зависает (все содержимое пользовательского интерфейса выполняется в основном потоке, поэтому вы должны сделать все, чтобы не блокировать его).Причина, по которой он не зависнет в следующий раз, вероятно, заключается в том, что он кэшировал данные изображения.

Вы должны использовать асинхронные API, NSURLConnection имеет некоторые, однако я настоятельно рекомендую ASIHTTPRequest , которыйявляется оберткой obj c вокруг NSURLConnection и co.Код будет выглядеть примерно так (прочитайте раздел о том, как использовать)

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
   UIImage* downloadedImage = [UIImage imageWithData:responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}
0 голосов
/ 29 февраля 2012

Извините, полностью забыл об этой теме.Я закончил тем, что решил эту проблему.Вот что я сделал:

NSFileManager* fileManager = [NSFileManager defaultManager];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];

NSString *myFilePath = [libraryDirectory stringByAppendingPathComponent:image_path];

BOOL fileExists = [fileManager fileExistsAtPath:myFilePath];

if (fileExists){
    hotel_image = [UIImage imageWithContentsOfFile:myFilePath];
}else{
    [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:[HotelsDetailsViewController class] withObject:image_path];

    fileExists = [fileManager fileExistsAtPath:myFilePath];

    if (fileExists){
        hotel_image = [UIImage imageWithContentsOfFile:myFilePath];
    }else{
        hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"];
    }
}

Короче говоря, я нашел каталог библиотеки своего приложения и сохранил там.

...