-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor: LOImageCacher 구현 #351
Conversation
iOS/Layover/Layover/LOImageCacher/Sources/LOImageCacher/LOImageFetcher.swift
Outdated
Show resolved
Hide resolved
|
||
extension LOImageCacherWrapper where Base: UIImageView { | ||
|
||
@MainActor |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UIImageView의 내부 프로퍼티인 image를 직접적으로 변경하고있어서 메소드에 MainActor 어노테이션을 선언하지 않으면 외부 객체(다른 컨텍스트)에서 프로퍼티를 변경할 수 없더라구요.
그런데 인환님 리뷰를 보다보니 아래 코드가 더 명확한 것 같아 이렇게 변경하려고 합니다!! 혹시 제가 잘못 이해한 것 있으면 알려주세욤
아래 코드에서 MainActor를 제거하면 실행은 되지만 백그라운드 스레드에서 updateImage가 호출되고 런타임 에러가 발생합니다!
extension LOImageCacherWrapper where Base: UIImageView {
public func setImage(with url: URL) {
Task {
if let data = await LOImageFetcher.shared.fetchImage(from: url) {
await updateImage(data)
}
}
}
@MainActor
private func updateImage(_ data: Data) {
self.base.image = UIImage(data: data)
}
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MainActor 내부에 있는 프로퍼티가 고립된 상태라, 내부의 업데이트 메소드 등을 이용해 await 키워드를 붙여 호출하는 것은 가능하지만
직접적으로 변경하는 것은 외부에서 어떤 컨텍스트에서 접근하는지 모르니 이런 에러가 발생하는 것이 아닐까.. 생각해봅니다 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 유경님 말씀대로 제가 지금껏 Task에 대해 잘못 이해하고 있었네요
Task는 생성하는 시점의 actor-context를 이어받기 때문에, mainactor로 마킹을 시켜준 곳의 Task는 Main 스레드에서 동작되는 것이라 하네요
그래서 제가 말씀드린 것처럼 mainactor를 떼게 되면 해당 컨텍스트에서는 main 스레드인지 보장이 안되니 오류가 발생한다고 하네요
Task는 비동기 컨텍스트를 제공하는 것
이지 실행 스레드
를 제공하는 게 아니라는 걸 알았습니다.
Swift Concurrency... 제대로 다시 공부해야겠네요 ㅠㅠ 죄송함니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이해하고 나니까 원본이 좀더 괜찮아보이긴 하지만...유경님 원하시는 대로 하셔도 좋을 것 같습니다!
func configure(thumbnailImgaeURL: URL?) { | ||
if let thumbnailImgaeURL { | ||
thumbnailImageView.lo.setImage(with: thumbnailImgaeURL) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
image 오타 있습니다~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
허거덩 감사합니다 🙀
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wrapper까지 구현하셨네요?!?
고생하셨습니다~~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
image cache를 취소하는 경우는 생기지 않나요? prepareForReuse때라던가
스토리지에 저장한 데이터를 지우는 경우도 필요 없는지 궁금합니다.
코드 상 큰 문제는 없어 보여 approve합니다. 고생하셨습니다.
init(memory: Cache = Cache(), | ||
disk: FileManager = .default) { | ||
self.memory = memory | ||
self.disk = disk | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://developer.apple.com/documentation/foundation/nscache/1407672-totalcostlimit
totalCostLimit을 지정하지 않으면 무한정으로 캐시에 데이터를 올려놓는다고 합니다. 해당 부분 제한을 두는건 어떨까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
마스터 클래스나 코드리뷰 때 이 부분에 대한 의견이 좀 나뉘었던게 기억나서, 지금은 iOS 내부 시스템에게 맡기도록 하였는데요..
킹피셔를 참고해서 공부하면서 한번 수정해보도록 하겠습니다 !!
🧑🚀 PR 요약
해당 pr에서 작업한 내역을 적어주세요.
LOImageCacher
를 구현했습니다.📌 변경 사항
변경사항 및 주의 사항 (모듈 설치 등)을 적어주세요.
📸 ScreenShot
작동, 구현화면
Linked Issue
close #337