在开始时创建数百个 UIImage 并让它们在 Swift 中的任何地方可用的最佳方法?
Best way to create hundreds of UIImage at start and have them available from any where in Swift?
我在 xcassets 中有大约 120 张图像,我想在我启动我的应用程序时使用 UIImage(或者如果你有更好的方法,可以使用其他方法)创建这些图像,并让它们在我的应用程序中的任何地方可用,因为它们不会改变,我可能需要很多次。
我想在我的主视图的 viewDidLoad 中创建它们,但是如何在不创建 struc 然后创建静态变量的情况下让它们对任何视图控制器可用?这可能吗?
那里的最佳做法是什么?
感谢您的帮助。
更新:
问题是我有一个允许用户选择国家列表的视图。每个国家由一个标签和一个图像(国旗,小于 10KB)表示。在应用程序的生命周期中,这个视图可能会被多次访问。这就是为什么我想在创建 UIImage 时将它们存储在某个地方,这样我就不必每次进入该视图时都重新创建它们。但事实上,我不应该在应用程序开始时创建它们,而是在第一次加载我的视图时创建它们。
在iPhone/iPad这样的移动设备上(硬件能力相对有限),不建议提前初始化所有的应用资源;相反,最好做 'lazy initialization',例如仅在 if 和 when 需要它们时加载图像。特别是如果它多达 120 张图像(这不仅是我的意见,而且是 Apple 自己建议的 "best practice",并且大多数 iOS 开发人员都遵守)。
关于让它们在您的应用程序的任何位置可用,如果您使用系统提供的加载机制和上述惰性初始化策略,那么没有什么特别要做的:只需调用(例如)-[UIImage imageNamed:]
(在您的案例,swift 等价物)来自相关位置。
如果您仍然希望尽早 "preload" 所有图像并缓存它们,您可以使用单例对象并将其命名为 class ImageManager
或类似名称.
无论如何,您应该平衡通过不必按需加载图像而获得的小速度与一直对应用程序施加的内存压力之间的平衡。
当然,如果每个图像都非常小(如@Rob 所建议的),您可以在内存使用方面摆脱它。
编辑 -
找到实际需要图像的代码位置(出于显示目的或其他目的),并在其中插入方法调用以加载这些图像。请参见下面的示例(抱歉,它在 Objective-C 中,而不是 swift):
// Example
// Custom UIViewController subclass that controls one of your app's screens
// where an image is needed.
- (void) viewDidLoad
{
[super viewDidLoad];
/* Lazy initialization: load image just before it is needed,
not earlier.
*/
UIImage* myImage = [UIImage imageNamed:@"MyImage"];
// Note: imageNamed: caches the images it loads. If you call it
// again later with the same image name, and it is still in memory,
// it will use that instance instead of loading the file again from
// disk.
UIImageView* myImageView = [[UIImageView alloc] initWithImage:myImage];
[self.view addSubview: myImageView];
}
我在 xcassets 中有大约 120 张图像,我想在我启动我的应用程序时使用 UIImage(或者如果你有更好的方法,可以使用其他方法)创建这些图像,并让它们在我的应用程序中的任何地方可用,因为它们不会改变,我可能需要很多次。
我想在我的主视图的 viewDidLoad 中创建它们,但是如何在不创建 struc 然后创建静态变量的情况下让它们对任何视图控制器可用?这可能吗?
那里的最佳做法是什么?
感谢您的帮助。
更新:
问题是我有一个允许用户选择国家列表的视图。每个国家由一个标签和一个图像(国旗,小于 10KB)表示。在应用程序的生命周期中,这个视图可能会被多次访问。这就是为什么我想在创建 UIImage 时将它们存储在某个地方,这样我就不必每次进入该视图时都重新创建它们。但事实上,我不应该在应用程序开始时创建它们,而是在第一次加载我的视图时创建它们。
在iPhone/iPad这样的移动设备上(硬件能力相对有限),不建议提前初始化所有的应用资源;相反,最好做 'lazy initialization',例如仅在 if 和 when 需要它们时加载图像。特别是如果它多达 120 张图像(这不仅是我的意见,而且是 Apple 自己建议的 "best practice",并且大多数 iOS 开发人员都遵守)。
关于让它们在您的应用程序的任何位置可用,如果您使用系统提供的加载机制和上述惰性初始化策略,那么没有什么特别要做的:只需调用(例如)-[UIImage imageNamed:]
(在您的案例,swift 等价物)来自相关位置。
如果您仍然希望尽早 "preload" 所有图像并缓存它们,您可以使用单例对象并将其命名为 class ImageManager
或类似名称.
无论如何,您应该平衡通过不必按需加载图像而获得的小速度与一直对应用程序施加的内存压力之间的平衡。
当然,如果每个图像都非常小(如@Rob 所建议的),您可以在内存使用方面摆脱它。
编辑 - 找到实际需要图像的代码位置(出于显示目的或其他目的),并在其中插入方法调用以加载这些图像。请参见下面的示例(抱歉,它在 Objective-C 中,而不是 swift):
// Example
// Custom UIViewController subclass that controls one of your app's screens
// where an image is needed.
- (void) viewDidLoad
{
[super viewDidLoad];
/* Lazy initialization: load image just before it is needed,
not earlier.
*/
UIImage* myImage = [UIImage imageNamed:@"MyImage"];
// Note: imageNamed: caches the images it loads. If you call it
// again later with the same image name, and it is still in memory,
// it will use that instance instead of loading the file again from
// disk.
UIImageView* myImageView = [[UIImageView alloc] initWithImage:myImage];
[self.view addSubview: myImageView];
}