目标C - 如何从另一个类更改图像(另一个UIViewController)

时间:2014-10-07 12:56:49

标签: ios objective-c iphone xcode parse-platform

我正在使用NSObject类来处理一些服务器方法。

其中一种方法是从DB(parse.com)下载图像。

问题在于,呈现图像的UIViewController加载速度比下载过程(图像总是nil)快,并且只有2秒后图像才会出现在设备中。

如何从UIImageView类(具有下载方法的类)更新NSObject图像(userProfile类)?

  • 我没有使用导航栏 - 但图片的UIViewController位于UITabBar

我知道如何检测下载过程的结束但我不知道如何从其他类到达UIImageView属性。

4 个答案:

答案 0 :(得分:2)

根据您的要求使用delegate。检查implement delegateios_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];

或者更好的是,您可以编写自己的blockdelegate方法,并在下载图像时传递下载的图像。

答案 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库。图书馆的设计就像我说的那样。