UIImage - должен быть загружен с [UIImage imageNamed: @ ""] или нет? - PullRequest
0 голосов
/ 10 апреля 2010
  • У меня есть количество изображений в моем приложении. (изображения более 50 - приблизительно и могут расширяться в соответствии с потребностями клиента)
  • Каждое изображение очень большого размера - 1024 x 768 и 150 dpi
  • Теперь я должен добавить все эти изображения в виде прокрутки и отобразить их.

Хорошо, мой вопрос следующий.

По мне, есть два варианта загрузки больших изображений

  1. imageNamed: @ ""
  2. загружается асинхронно, когда вызывается viewDidLoad.

Что предпочтительнее?


imgModel.image=[UIImage imageNamed:[dMain valueForKey:@"imgVal"]];

или как это.

    NSURL *ur=[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:lblModelName.text ofType:@"png"] isDirectory:NO];

    NSURLRequest *req=[NSURLRequest requestWithURL:ur cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:40];
    [ur release];
    NSURLConnection *con=[[NSURLConnection alloc] initWithRequest:req delegate:self];
    if(con){
        myWebData=[[NSMutableData data] retain];
    } else {
    }

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

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

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [connection release];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"ImageView Ref From - %@",imgV);
    // my image view & set image  
    imgV.image=[UIImage imageWithData:myWebData];
    [connection release]; connection=nil;
}

Ответы [ 2 ]

3 голосов
/ 10 апреля 2010

Знаете ли вы, что изображения не помещаются в память сразу? Если вы хотите прокручивать их между собой, вы должны перемещать их по страницам, чтобы сохранить приличный объем памяти.

Что касается их загрузки, вам, вероятно, следует отобразить счетчик, начать загрузку изображения в фоновом режиме, а затем заменить его на изображение, как только оно будет готово. Загрузка изображения с помощью NSURLConnection излишня, вам, вероятно, будет проще с imageNamed:

- (void) startLoadingImage {
    // You need an autorelease pool since you are running
    // in a different thread now.
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    UIImage *image = [UIImage imageNamed:@"foo"];
    // All GUI updates have to be done from the main thread.
    // We wait for the call to finish so that the pool won’t
    // claim the image before imageDidFinishLoading: finishes.
    [self performSelectorOnMainThread:@selector(imageDidFinishLoading:)
        withObject:image waitUntilDone:YES];
    [pool drain];
}

- (void) viewDidLoad {
    UIActivityIndicator *spinner = …;
    [self.view addSubview:spinner];
    [self performSelectorInBackground:@selector(startLoadingImage)
         withObject:nil];
}

- (void) imageDidFinishLoading: (UIImage*) image {
    // fade spinner out
    // create UIImageView and fade in
}

Имена методов пишутся по памяти, я мог пропустить параметр здесь или там. Но в принципе код является звуковым.

0 голосов
/ 10 апреля 2010

Асинхронная загрузка почти всегда предпочтительна для предотвращения не отвечающих пользовательских интерфейсов (особенно в viewDidLoad).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...