2014-10-07 5 views
0

Я использую класс NSObject для обработки нескольких методов сервера.Objective C - Как изменить изображение из другого класса (другой UIViewController)

Одним из методов является загрузка изображений из БД (parse.com).

Проблема заключается в том, что представленный образ UIViewController загружается быстрее, чем процесс загрузки (изображение всегда nil), и только через 2 секунды изображение находится на устройстве.

Как я могу обновить изображение UIImageView (класс userProfile) из класса NSObject (тот, у кого есть метод загрузки)?

  • Я не использую панель навигации - но UIViewController с изображением в UITabBar

Я знаю, как определить конец процесса загрузки, но я не знаю, как добраться до свойство UIImageView из другого класса.

+0

Вы можете использовать [SDWebImage] (https://github.com/rs/SDWebImage#installation). Это позволит вам обновить изображение в асинхронном режиме. – nikhil84

+0

Получаете ли вы какое-либо событие после завершения загрузки изображения? –

+0

Да, я знаю, как определить конец процесса загрузки, но я не знаю, как добраться до свойства UIImageView из другого класса. –

ответ

2

Используйте delegate для вашего требования. Проверьте implement delegate или ios_delegates, как это можно сделать.

Некоторое понимание приводится ниже:

Say и есть метод делегата в классе NSObject обрабатывать несколько методов сервера

@protocol YouNSObjectClassDelegate <NSObject> 
@required 
    -(void)imageDownloaded:(UIImage*)image; 
@end 

Добавить

@property (nonatomic,strong) id<YouNSObjectClassDelegate> delegate; 

при выделении любого объекта любой ViewController, не забыли проинформировать делегата

yourNSObjectClassObject.delegate = self; 

Когда изображение загружаются в NSObject классе

if ([delegate respondsToSelector:@selector(imageDownloaded:)]) { 
    [delegate imageDownloaded:image]; 
} 

В UIViewController, где и хотят иметь изображение добавить эти методы

-(void)imageDownloaded:(UIImage*)image 
{ 
    //Set Image here 
} 
+0

Я думаю, что это может быть ответ, но я никогда раньше не работал с такими делегатами. можете ли вы быть более конкретными, как это сделать и где мне нужно все писать? –

+0

@Asi Givati ​​Посмотри сейчас –

+0

Спасибо. Это все еще не работает для меня так хорошо, но я уверен, что это правильный ответ. Я думаю, что я делаю что-то неправильно. в классе «NSObject» .m делегат не распознается, даже если я использую «@synthesize». Я получаю ошибку, подобную этой переменной «экземпляр переменной», доступ к которой осуществляется в методе класса. –

0

В методе tableView cellForRowAtIndexPath вместо установки изображения непосредственно используйте асинхронный режим GCD и блок завершения.

В заголовке вашего загрузки класса объявить новый метод с блоком завершения:

- (void)downloadImagesWithCompletion:(void (^)(void))completion; 

И реализации:

- (void)downloadImagesWithCompletion:(void (^)(void))completion { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NO), ^(void){ 
     // Run your downloading here, and once your operation is complete... 
     dispatch_async(dispatch_get_main_queue(), ^(void){ 
      completion(); 
     }); 
    }); 
} 

В способе обработки вашего зрения контроллера, назовем его так:

[downloader downloadImagesWithCompletion:^(void) { 
{ 
    // your downloader is now complete, run your UI updates 
}]; 

Примечание: это e xample не содержит никаких возвращаемых значений в блоке завершения, но вы можете легко do that as well.

1

при звонке NSObject Class просто передайте свой UIImageView с другими параметрами, и когда ваше изображение загружено, просто установите новое изображение на UIImageView. Я предполагаю, что вы используете концепцию Threading, поэтому обновите свой UIImageView только на Main Thread. Вы можете использовать либо

dispatch_async(dispatch_get_main_queue(), ^(void){ 
     //Set your Image to UIImageView 
    }); 

ИЛИ использовать

[self performSelectorOnMainThread:@selector(updateImage:) withObject:objects waitUntilDone:YES]; 

Или лучше вы можете написать свой собственный block или delegate метод и передать загруженное изображение, когда изображение было загружено.

0

Вы бы лучше думать, как UIViewController является боссом. Это означает, что UIViewController начинает загрузку изображения, обрабатывает завершение и устанавливает изображение табуляции. Класс процесса загрузки изображений - это просто рабочий. Работник делегирует босса важным решениям.

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

Вы должны использовать библиотеку SDWebImage. Библиотека спроектирована, как я уже сказал.

Смежные вопросы