작성
·
174
답변 2
1
0
// Image
class ImageLoader: ObservableObject {
// Fields
@Published var image : UIImage?
var urlString : String
init(urlString: String) {
self.urlString = urlString
// URL 가져온후 function 호출
self.loadImageFromURL()
}
func loadImageFromURL(){
guard let url = URL(string: urlString) else {
return
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let hasData = data else {
return
}
guard let loadImage = UIImage(data: hasData)else{
return
}
// Background Thread 로 되면 안되서. 비동기 방식으로 해야함 _> self.image = loadImage 이거만 적으면 안됨.
DispatchQueue.main.async {
self.image = loadImage
}
}.resume()
}
}
// Protocol
struct URLImage: View {
@ObservedObject var loader: ImageLoader
// 위의 function을 쓸려면 View에서 URL넣는게 강제사항이 되버리는 경우다.
init(urlString : String) {
self.loader = ImageLoader(urlString: urlString)
}
var body: some View{
// image data를 받아오기전에 실패 해버렸을 경우 Optional
Image(uiImage: loader.image ?? UIImage(named: "placeholderImage")! )
.resizable()
.aspectRatio(contentMode: .fit)
}
}// Image
class ImageLoader: ObservableObject {
// Fields
@Published var image : UIImage?
var urlString : String
init(urlString: String) {
self.urlString = urlString
// URL 가져온후 function 호출
self.loadImageFromURL()
}
func loadImageFromURL(){
guard let url = URL(string: urlString) else {
return
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let hasData = data else {
return
}
guard let loadImage = UIImage(data: hasData)else{
return
}
// Background Thread 로 되면 안되서. 비동기 방식으로 해야함 _> self.image = loadImage 이거만 적으면 안됨.
DispatchQueue.main.async {
self.image = loadImage
}
}.resume()
}
}
// Protocol
struct URLImage: View {
@ObservedObject var loader: ImageLoader
// 위의 function을 쓸려면 View에서 URL넣는게 강제사항이 되버리는 경우다.
init(urlString : String) {
self.loader = ImageLoader(urlString: urlString)
}
var body: some View{
// image data를 받아오기전에 실패 해버렸을 경우 Optional
Image(uiImage: loader.image ?? UIImage(named: "placeholderImage")! )
.resizable()
.aspectRatio(contentMode: .fit)
}
}// Image
class ImageLoader: ObservableObject {
// Fields
@Published var image : UIImage?
var urlString : String
init(urlString: String) {
self.urlString = urlString
// URL 가져온후 function 호출
self.loadImageFromURL()
}
func loadImageFromURL(){
guard let url = URL(string: urlString) else {
return
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let hasData = data else {
return
}
guard let loadImage = UIImage(data: hasData)else{
return
}
// Background Thread 로 되면 안되서. 비동기 방식으로 해야함 _> self.image = loadImage 이거만 적으면 안됨.
DispatchQueue.main.async {
self.image = loadImage
}
}.resume()
}
}
// Protocol
struct URLImage: View {
@ObservedObject var loader: ImageLoader
// 위의 function을 쓸려면 View에서 URL넣는게 강제사항이 되버리는 경우다.
init(urlString : String) {
self.loader = ImageLoader(urlString: urlString)
}
var body: some View{
// image data를 받아오기전에 실패 해버렸을 경우 Optional
Image(uiImage: loader.image ?? UIImage(named: "placeholderImage")! )
.resizable()
.aspectRatio(contentMode: .fit)
}
}
////-----////-----////-----////-----////-----////-----////-----////-----////-----////-----
ContentView
////-----////-----////-----////-----////-----////-----////-----////-----////-----////----
NavigationLink(
destination:
UserDetailView(user: user),
label: {
HStack
{
URLImage(urlString: user.avatar)
.frame(width: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, height: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/)
Text("\(user.name)")
Spacer()NavigationLink(
destination:
UserDetailView(user: user),
label: {
HStack
{
URLImage(urlString: user.avatar)
.frame(width: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, height: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/)
Text("\(user.name)")
Spacer()
안녕하세요
좀 확인을 해봤는데 제가 강의 예시로 든 mockapi 사이트의 image url이 제대로 나오질 않네요.
mockapi사이트를 무료로 테스트하면서 제한이 있는건가 싶네요.
코드상에서는 문제는 없는걸로 보입니다.
user 정보는 불러와 지는데
avatar 이미지 불러오기는 안되는 상황입니다.
어떻게 올려야할지를 모르겠어요