|
|
@@ -114,69 +114,23 @@ extension KingfisherWrapper where Base: UIButton {
|
|
|
progressBlock: DownloadProgressBlock? = nil,
|
|
|
completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil) -> DownloadTask?
|
|
|
{
|
|
|
- guard let source = source else {
|
|
|
- base.setImage(placeholder, for: state)
|
|
|
- setTaskIdentifier(nil, for: state)
|
|
|
- completionHandler?(.failure(KingfisherError.imageSettingError(reason: .emptySource)))
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- var options = parsedOptions
|
|
|
- if !options.keepCurrentImageWhileLoading {
|
|
|
- base.setImage(placeholder, for: state)
|
|
|
- }
|
|
|
-
|
|
|
var mutatingSelf = self
|
|
|
- let issuedIdentifier = Source.Identifier.next()
|
|
|
- setTaskIdentifier(issuedIdentifier, for: state)
|
|
|
-
|
|
|
- if let block = progressBlock {
|
|
|
- options.onDataReceived = (options.onDataReceived ?? []) + [ImageLoadingProgressSideEffect(block)]
|
|
|
- }
|
|
|
-
|
|
|
- let task = KingfisherManager.shared.retrieveImage(
|
|
|
+ return setImage(
|
|
|
with: source,
|
|
|
- options: options,
|
|
|
- downloadTaskUpdated: { task in
|
|
|
- Task { @MainActor in mutatingSelf.imageTask = task }
|
|
|
- },
|
|
|
- progressiveImageSetter: { self.base.setImage($0, for: state) },
|
|
|
- referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier(for: state) },
|
|
|
- completionHandler: { result in
|
|
|
- CallbackQueueMain.currentOrAsync {
|
|
|
- guard issuedIdentifier == self.taskIdentifier(for: state) else {
|
|
|
- let reason: KingfisherError.ImageSettingErrorReason
|
|
|
- do {
|
|
|
- let value = try result.get()
|
|
|
- reason = .notCurrentSourceTask(result: value, error: nil, source: source)
|
|
|
- } catch {
|
|
|
- reason = .notCurrentSourceTask(result: nil, error: error, source: source)
|
|
|
- }
|
|
|
- let error = KingfisherError.imageSettingError(reason: reason)
|
|
|
- completionHandler?(.failure(error))
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- mutatingSelf.imageTask = nil
|
|
|
- mutatingSelf.setTaskIdentifier(nil, for: state)
|
|
|
-
|
|
|
- switch result {
|
|
|
- case .success(let value):
|
|
|
- self.base.setImage(value.image, for: state)
|
|
|
- completionHandler?(result)
|
|
|
-
|
|
|
- case .failure:
|
|
|
- if let image = options.onFailureImage {
|
|
|
- self.base.setImage(image, for: state)
|
|
|
- }
|
|
|
- completionHandler?(result)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ imageAccessor: ImagePropertyAccessor(
|
|
|
+ setImage: { image, _ in base.setImage(image, for: state) },
|
|
|
+ getImage: { base.image(for: state) }
|
|
|
+ ),
|
|
|
+ taskAccessor: TaskPropertyAccessor(
|
|
|
+ setTaskIdentifier: { setTaskIdentifier($0, for: state) },
|
|
|
+ getTaskIdentifier: { taskIdentifier(for: state) },
|
|
|
+ setTask: { mutatingSelf.imageTask = $0 }
|
|
|
+ ),
|
|
|
+ placeholder: placeholder,
|
|
|
+ parsedOptions: parsedOptions,
|
|
|
+ progressBlock: progressBlock,
|
|
|
+ completionHandler: completionHandler
|
|
|
)
|
|
|
-
|
|
|
- mutatingSelf.imageTask = task
|
|
|
- return task
|
|
|
}
|
|
|
|
|
|
// MARK: Cancelling Downloading Task
|
|
|
@@ -269,71 +223,27 @@ extension KingfisherWrapper where Base: UIButton {
|
|
|
progressBlock: DownloadProgressBlock? = nil,
|
|
|
completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil) -> DownloadTask?
|
|
|
{
|
|
|
- guard let source = source else {
|
|
|
- base.setBackgroundImage(placeholder, for: state)
|
|
|
- setBackgroundTaskIdentifier(nil, for: state)
|
|
|
- completionHandler?(.failure(KingfisherError.imageSettingError(reason: .emptySource)))
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- var options = parsedOptions
|
|
|
- if !options.keepCurrentImageWhileLoading {
|
|
|
- base.setBackgroundImage(placeholder, for: state)
|
|
|
- }
|
|
|
-
|
|
|
var mutatingSelf = self
|
|
|
- let issuedIdentifier = Source.Identifier.next()
|
|
|
- setBackgroundTaskIdentifier(issuedIdentifier, for: state)
|
|
|
-
|
|
|
- if let block = progressBlock {
|
|
|
- options.onDataReceived = (options.onDataReceived ?? []) + [ImageLoadingProgressSideEffect(block)]
|
|
|
- }
|
|
|
-
|
|
|
- let task = KingfisherManager.shared.retrieveImage(
|
|
|
+ return setImage(
|
|
|
with: source,
|
|
|
- options: options,
|
|
|
- downloadTaskUpdated: { task in
|
|
|
- Task { @MainActor in
|
|
|
- mutatingSelf.backgroundImageTask = task
|
|
|
- }
|
|
|
- },
|
|
|
- progressiveImageSetter: { self.base.setBackgroundImage($0, for: state) },
|
|
|
- referenceTaskIdentifierChecker: { issuedIdentifier == self.backgroundTaskIdentifier(for: state) },
|
|
|
- completionHandler: { result in
|
|
|
- CallbackQueueMain.currentOrAsync {
|
|
|
- guard issuedIdentifier == self.backgroundTaskIdentifier(for: state) else {
|
|
|
- let reason: KingfisherError.ImageSettingErrorReason
|
|
|
- do {
|
|
|
- let value = try result.get()
|
|
|
- reason = .notCurrentSourceTask(result: value, error: nil, source: source)
|
|
|
- } catch {
|
|
|
- reason = .notCurrentSourceTask(result: nil, error: error, source: source)
|
|
|
- }
|
|
|
- let error = KingfisherError.imageSettingError(reason: reason)
|
|
|
- completionHandler?(.failure(error))
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- mutatingSelf.backgroundImageTask = nil
|
|
|
- mutatingSelf.setBackgroundTaskIdentifier(nil, for: state)
|
|
|
-
|
|
|
- switch result {
|
|
|
- case .success(let value):
|
|
|
- self.base.setBackgroundImage(value.image, for: state)
|
|
|
- completionHandler?(result)
|
|
|
-
|
|
|
- case .failure:
|
|
|
- if let image = options.onFailureImage {
|
|
|
- self.base.setBackgroundImage(image, for: state)
|
|
|
- }
|
|
|
- completionHandler?(result)
|
|
|
- }
|
|
|
+ imageAccessor: ImagePropertyAccessor(
|
|
|
+ setImage: { image, _ in
|
|
|
+ base.setBackgroundImage(image, for: state)
|
|
|
+ },
|
|
|
+ getImage: {
|
|
|
+ base.backgroundImage(for: state)
|
|
|
}
|
|
|
- }
|
|
|
+ ),
|
|
|
+ taskAccessor: TaskPropertyAccessor(
|
|
|
+ setTaskIdentifier: { setBackgroundTaskIdentifier($0, for: state) },
|
|
|
+ getTaskIdentifier: { backgroundTaskIdentifier(for: state) },
|
|
|
+ setTask: { mutatingSelf.backgroundImageTask = $0 }
|
|
|
+ ),
|
|
|
+ placeholder: placeholder,
|
|
|
+ parsedOptions: parsedOptions,
|
|
|
+ progressBlock: progressBlock,
|
|
|
+ completionHandler: completionHandler
|
|
|
)
|
|
|
-
|
|
|
- mutatingSelf.backgroundImageTask = task
|
|
|
- return task
|
|
|
}
|
|
|
|
|
|
// MARK: Cancelling Background Downloading Task
|