inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

SwiftUI - iOS14 퍼펙트 가이드

2 Network Image

Network Image

216

Tae hyun Kim

작성한 질문수 1

0

가르쳐  주시는대로 따라 만들고  있는데

user의 이름부분의 데이터는 잘 가져오는데   

Image load 부분에서 이미지가 오지않는경우는 어떻게 해야하나여? .resume도 하고.. 제가 봤을때는 아무 문제 없어 보이는데..  

혹시 파일 따로  받을수는 없나요?

ios SwiftUI

답변 2

1

DevAccount app

강의에 나오는 url을 그대로 사용하면 사진이 로드되지않네요 
mockapi에서 새로 url 생성해서 사용하면 이미지 로드가 됩니다 ㅎㅎ

0

iOS Developer - 이정

안녕하세요

파일은 따로 준비되어 있지 않습니다.

안되는 부분 올려주시면 한번 확인해 보겠습니다.

0

Tae hyun Kim

user 정보는 불러와 지는데 

avatar 이미지 불러오기는 안되는 상황입니다. 

어떻게 올려야할지를 모르겠어요 

0

iOS Developer - 이정

이미지쪽 소스코드 긁어서 여기에 복사 붙여넣기 하시면 될 것 같습니다.

0

Tae hyun Kim

// 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()

0

iOS Developer - 이정

안녕하세요

좀 확인을 해봤는데 제가 강의 예시로 든 mockapi 사이트의 image url이 제대로 나오질 않네요.

mockapi사이트를 무료로 테스트하면서 제한이 있는건가 싶네요.

코드상에서는 문제는 없는걸로 보입니다.

커스텀 팝업 사용하는 방법

0

266

1

Grid View 강의에서 animation 질문

0

371

1

iOS 16 ScrollView에서 proxy.scrollTo 오류

0

610

2

10 list section 강의 잘린건가요?

0

356

2

Conflicting arguments to generic parameter 'Content' 에러 질문

0

819

1

tickCount에러 문의

0

378

1

Picker를 사용해서 각 item별로 다른 값을 Core Data에 저장하려고 합니다.

0

234

0

강의 파일 다운로드

0

370

2

Grid강의 듣다가 궁금해서 글 남깁니다

0

269

1

sceneDelegate

0

293

1

ClockNumber 에러발생

0

385

2

강의 순서 문의

0

235

1

grid 질문 있습니다!

0

243

1

안녕하세요

0

275

1

LazeVGrid 관련 문의드립니다

0

212

1

질문 드립니다.

0

194

1

버튼과 토글에서 State관련 문의

0

245

1

UIView vs. UIViewController 질문입니다.

0

377

1

선생님. 질문드립니다.

0

289

1

앱개발하다가 궁금한 부분이 생겨서 질문 드립니다

0

265

1

기존 앱개발하다가 해당 강의를 듣는 도중 궁금한 부분이 생겨서 여쭤봅니다.

0

271

1

바인딩 값에 특정 하나의 값을 할당하기

0

284

3

1234567 곱하기 2를 계산을 하면 2.46913e+06 이렇게 나오네요???

0

282

2

ForEach 의 값을 어레이에서 받아왔는데요. 스크롤뷰리더로 감싸면 리프레쉬가 안됩니다.

0

274

1