【问题标题】:Objective C - How to change image from another class (another UIViewController)Objective C - 如何从另一个类(另一个 UIViewController)更改图像
【发布时间】:2014-10-07 12:56:48
【问题描述】:

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

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

问题是提供图像的UIViewController 加载速度比下载过程快(图像总是nil),并且仅在 2 秒后图像就在设备中。

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

  • 我没有使用导航栏 - 但带有图像的UIViewControllerUITabBar

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

【问题讨论】:

  • 您可以使用SDWebImage。这将允许您以异步方式更新图像。
  • 图片下载完成后有没有收到任何事件?
  • 是的,我知道如何检测下载过程的结束,但我不知道如何从其他类访问 UIImageView 属性。

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


【解决方案1】:

根据您的要求使用delegate。检查implement delegateios_delegates 如何完成。

下面给出一些理解:

假设你在 NSObject 类中有委托方法来处理一些服务器方法

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

添加

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

在分配对象时,不要忘记初始化委托

yourNSObjectClassObject.delegate = self;

在 NSObject 类中下载图片时

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

在你想要图像的 UIViewController 中添加这些方法

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

【讨论】:

  • 我认为这可能是答案,但我以前从未与这样的代表合作过。能否请您更具体地说明如何操作以及我需要在哪里写所有内容?
  • @Asi Givati 立即查看
  • 使用完成块可以轻松得多。
  • 你为什么不编辑答案并展示如何使用完成块来完成。
【解决方案2】:

当您调用NSObject Class 时,只需将您的UIImageView 与其他参数一起传递,当您的图像被下载时,只需将新图像设置为UIImageView。我猜你正在使用线程概念,所以只在Main Thread 上更新你的UIImageView。您可以使用任一

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

或使用

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

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

【讨论】:

    【解决方案3】:

    在tableView的cellForRowAtIndexPath方法中,不要直接设置图片,而是使用GCD async和完成块。

    在您的下载类头文件中声明一个带有完成块的新方法:

    - (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

    【讨论】:

      【解决方案4】:

      你最好认为 UIViewController 是一个老板。这意味着 UIViewController 开始下载图像,处理完成,并设置 Tabbar 图像。下载图像进程的类只是一个工人。工人将老板委派给重要决策。

      下载图像进程类尝试直接设置Tabbar图像不是一个好主意。最好将类设计为具有委托协议或块函数来告诉“某人”完成图像的下载。

      您最好使用SDWebImage 库。图书馆的设计就像我说的那样。

      【讨论】:

        猜你喜欢
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        相关资源
        最近更新 更多