我正在使用NSObject
类来处理一些服务器方法。
其中一种方法是从DB(parse.com)下载图像。
问题在于,呈现图像的UIViewController
加载速度比下载过程(图像总是nil
)快,并且只有2秒后图像才会出现在设备中。
如何从UIImageView
类(具有下载方法的类)更新NSObject
图像(userProfile类)?
UIViewController
位于UITabBar
我知道如何检测下载过程的结束但我不知道如何从其他类到达UIImageView属性。
答案 0 :(得分:2)
根据您的要求使用delegate
。检查implement delegate或ios_delegates如何完成。
下面给出了一些理解:
假设你在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
}
答案 1 :(得分:1)
当您致电NSObject Class
时,只需将UIImageView
与其他参数一起传递,当您下载图片时,只需将新图片设置为UIImageView
。我猜您使用的是线程概念,因此仅在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
方法,并在下载图像时传递下载的图像。
答案 2 :(得分: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
}];
注意:此示例在完成块中不包含任何返回值,但您可以轻松do that as well。
答案 3 :(得分:0)
你最好认为UIViewController是老板。这意味着UIViewController开始下载图像,处理完成并设置Tabbar图像。下载图像处理类只是一个工作者。工人委托老板做出重要决定。
下载图像处理类尝试直接设置Tabbar图像并不是一个好主意。设计类有一个委托协议或块函数来告诉'某人'完成图像下载是个好主意。
您最好使用SDWebImage库。图书馆的设计就像我说的那样。