Moa,为 iOS、tvOS 和 macOS 编写的 Swift 语言图像下载器
Moa 是一个用 Swift 编写的图像下载库。通过设置其 moa.url
属性,它允许在图像视图中下载并显示一个图像。
imageView.moa.url = "https://bit.ly/moa_image"
- 图像是异步下载的。
- 使用 URLSession 进行网络和缓存。
- 允许配置缓存大小和策略。
- 可以不使用图像视图使用。
- 提供闭包属性用于图像操作和错误处理。
- 包括模拟网络响应的单元测试模式。
- 包含调试网络问题的日志功能。
"失去,就像莫亚(鳥)失去了一样" - 毛利谚语
'Hunting Moa' 绘画由 Joseph Smit(1836-1929)绘制。文件来源:[维基百科官网](http://commons.wikimedia.org/wiki/File:Hunting_Moa.jpg)。
设置
有几种方法可以将 Moa 添加到您的 Xcode 项目中。
添加源(iOS 7+)
只需将 MoaDistrib.swift 文件添加到您的 Xcode 项目中。
使用 Carthage (iOS 8+) 设置
或者,将 github "evgenyneu/moa" ~> 12.0
添加到您的 Cartfile 并运行 carthage update
。
使用 CocoaPods (iOS 8+) 设置
如果您正在使用 CocoaPods,请将以下文本添加到 Podfile 并运行 pod install
。
use_frameworks!
target 'Your target name'
pod 'moa', '~> 12.0'
使用 Swift Package Manager 设置
- 在 Xcode 11+ 中,选择 文件 > 包 > 添加包依赖...。
- 输入此项目的 URL: https://github.com/evgenyneu/moa.git
遗留 Swift 版本
如果您使用的是旧版本的 Swift,则设置库的先前版本。
用法
-
将
import moa
添加到您的源代码(除非您使用了文件设置方法)。 -
将 Image View 拖到故事板中的视图中。在视图控制器中为您创建此 Image View 的 outlet 属性。或者,您也可以在代码中创建
UIImageView
对象而不是使用故事板。 -
将图像视图的
moa.url
属性设置为开始异步图像下载。下载完成后,图像将自动显示。
imageView.moa.url = "https://bit.ly/moa_image"
从不可信的HTTP主机加载图片
如果您的图片URL不是https,您需要将异常添加到Info.plist文件中。这将允许App Transport Security从不可信的HTTP主机加载图片。
取消下载
当以下情况发生时,自动取消对图片视图的图片下载:
- 图片视图被释放。
- 启动新的图片下载:
imageView.moa.url = ...
。
调用imageView.moa.cancel()
手动取消下载。
提供错误图片
您可以在发生图片下载错误时提供错误图片以满足需求。
imageView.moa.errorImage = UIImage(named: "ImageNotFound.jpg")
imageView.moa.url = "https://bit.ly/moa_image"
或者,您也可以提供全局错误图片,用于所有失败的图片下载。
Moa.errorImage = UIImage(named: "ImageNotFound.jpg")
显示占位图图片
以下是如何在图片视图中显示占位图图片的方法。当网络图片到达时,占位图将被替换。
imageView.image = placeholderImage
imageView.moa.url = "https://bit.ly/moa_image"
高级功能
提供完成闭包
为接收到的图片分配一个将调用的闭包。
imageView.moa.onSuccess = { image in
return image
}
imageView.moa.url = "https://bit.ly/moa_image"
- 下载完成后,在将图片分配给视图之前调用闭包。
- 这是一个在显示之前操纵图片的好地方。
- 闭包返回一个将在视图中显示的图片。如果您不希望显示图片,则返回 nil。
- 闭包在 主队列 中调用。如果您需要执行耗时操作,请使用
onSuccessAsync
属性。 - 当
errorImage
提供并发生错误时,调用成功闭包。
提供错误闭包
imageView.moa.onError = { error, response in
// Handle error
}
imageView.moa.url = "https://bit.ly/moa_image"
- 如果在主队列中调用闭包导致图片下载失败,请在需要执行耗时操作时使用
onErrorAsync
属性。 - 如果您需要了解错误的类型,请参阅“日志”部分。
在不使用视图下载图片
Moa
类的实例也可以不使用视图。需要保留对 Moa
实例的强引用。
let moa = Moa()
moa.onSuccess = { image in
// image is loaded
return image
}
moa.url = "https://bit.ly/moa_image"
清除 HTTP 会话
以下方法在当前的 URLSession 对象上调用 finishTasksAndInvalidate
。将为未来的图片下载创建一个新的会话对象。
MoaHttpSession.clearSession()
您可能永远不会需要在您的应用中调用此方法。我需要定期调用它来解决一个奇怪的问题URLSession 错误,您可能不会遇到。
图片缓存
使用 Moa.settings.cache
来更改缓存设置。有关更多信息,请参阅moa 图片缓存手册。
// By default images are cached according to their response HTTP headers.
Moa.settings.cache.requestCachePolicy = .useProtocolCachePolicy
// Always cache images locally regardless of their response HTTP headers
Moa.settings.cache.requestCachePolicy = .returnCacheDataElseLoad
// Change the name of the cache directory. Useful for sharing cache with the rest of the app.
Moa.settings.cache.diskPath = "MyAppSharedCache"
设置
使用Moa.settings
属性来更改moa图像下载设置。
// Set the maximum number of simultaneous image downloads. Default: 4.
Moa.settings.maximumSimultaneousDownloads = 5
// Change timeout for image requests. Default: 10.
Moa.settings.requestTimeoutSeconds = 20
日志记录
您可以使用Moa日志记录器查看图像的加载时间或调试网络问题。可以使用预制的MoaConsoleLogger
函数在Xcode控制台查看日志消息,或编写自定义记录器。参见日志记录手册获取更多信息。
// Log to console
Moa.logger = MoaConsoleLogger
// Load an image
imageView.moa.url = "https://bit.ly/moa_image"
// Attempt to load a missing image
imageView.moa.url = "https://bit.ly/moa_image_missing.jpg"
单元测试
有时候,防止代码做出真正的HTTP请求是有用的。Moa包含用于测试图像下载和伪造网络响应的MoaSimulator
类。参见单元测试手册获取更多信息。
// Autorespond with the given image to all image requests
MoaSimulator.autorespondWithImage("www.site.com", image: UIImage(named: "35px.jpg")!)
示例应用
该iOS示例应用展示了如何使用Moa在集合视图中加载图像。
备选解决方案
以下是Swift的其他图像下载库列表。
- cbot/Vincent
- daltoniam/Skeets
- Haneke/HanekeSwift
- hirohisa/ImageLoaderSwift
- natelyman/SwiftImageLoader
- onevcat/Kingfisher
- zalando/MapleBacon
致谢
许可协议
Moa遵循MIT许可协议发布。
欢迎反馈
如果您发现任何问题、陷入困境或只是想聊天,请随时创建一个问题。我会很高兴帮助您。
•ᴥ•
本项目献给巨鸟,一种在新西兰生活的不会飞的鸟类,于15世纪灭绝。