在模型中存储 UIImage 的最佳方式

Best Way to Store a UIImage in a Model

我对 iOS 开发和 MVC 概念还很陌生,但据我了解,该模型不应包含任何 UI 相关内容。我的 images.xcassets 文件夹中有一个名为 defaultImage 的图像,我想在初始化时将其设置为 class 的默认图像。此 class 是我的模型的一部分,具有以下 public 界面:

#import <Foundation/Foundation.h>

@interface myClass : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSData *imageData;

@end

我将图像存储为 NSData 的原因是因为根据我对模型中不允许 UI 的假设,我不能使用 UIImage 这里。但是我无法成功初始化 imageData 以包含图像数据。我尝试了以下方法:

#import "myClass.h"

@implementation myClass

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"No Name";
    self.imageData = [[NSData alloc] initWithContentsOfFile:@"defaultImage"];
    }
    return self;
}

@end

正如我所说,imageData 将包含 nil。环顾四周后,我找到了以下解决方案:

#import <UIKit/UIKit.h>
#import "myClass.h" 

@implementation myClass

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"No Name";
        self.imageData = [[NSData alloc] init];
        self.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"defaultImage"]);
    }
    return self;
}

@end

所以我的问题是,这是否违反了不允许 UI 和 UIKit 进入模型的规则?如果不是,请解释为什么不,如果是,还有其他方法吗?谢谢!

最好的方法是在模型中有图片名称或图片路径,你可以在任何需要的地方加载图片。

#import <Foundation/Foundation.h>

@interface myClass : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *imageName;

@end

最坏的情况,如果您必须在 class 本身中获取数据,请按以下方式使用。

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"No Name";
        //self.imageData = [[NSData alloc] init]; //--Not required
        self.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"defaultImage"]);
    }
    return self;
}