Получение изображения Dynami c из поста WordPress - PullRequest
1 голос
/ 10 марта 2020

У меня есть сообщение на WordPress, и оно содержит изображение, которое регулярно обновляется. Я хотел бы динамически запросить эту фотографию в Swift, но пока не нашел решения. Может ли кто-нибудь помочь мне? Вот мой код, для которого я сейчас запрашиваю обычное изображение:


   var coursesPicture = [CoursesPicture]()
    // MARK: - GUID

    struct GUIDURL: Codable {
        let rendered: String
    }


    // MARK: - Courses

    struct Course: Codable {
        let guid, title: GUID
        let content: Content
        let links: Links

        enum CodingKeys: String, CodingKey {
            case guid, title, content
            case links = "_links"
        }
    }


    // MARK: - Content

    struct Content: Codable {
        let rendered: String
        let protected: Bool
    }


    // MARK: - GUID

    struct GUID: Codable {
        let rendered: String
    }


    // MARK: - Links

    struct Links: Codable {
    }


    // MARK: - CoursePicture

    struct CoursesPicture: Codable {
        let featuredMedia: Int

        enum CodingKeys: String, CodingKey {
            case featuredMedia = "featured_media"
        }
    }

public func fetchJSONPicture() {
        let urlString = "https://ismaning.de/wp-json/wp/v2/media/4291"
        guard let url = URL(string: urlString) else { return }
        URLSession.shared.dataTask(with: url) { (data, _, err) in
            DispatchQueue.main.sync {
                if let err = err {
                    print("Failed to get data from url:", err)
                    return
                }

                guard let data = data else { return }

                do {

                    self.coursesPicture = [try JSONDecoder().decode(CoursesPicture.self, from: data)]
                } catch let jsonErr {
                    print("Failed to decode:", jsonErr)
                }
            }
        }
        if let url = URL(string: "https://ismaning.de/wp-content/uploads/ismaning-willkommen-banner_app-ios.jpg") {
            URLSession.shared.dataTask(with: url) { (data, urlResponse, error) in
                if let data = data {
                    DispatchQueue.main.sync {
                        self.imageView.image = UIImage(data: data)
                    }
                }
            }.resume()
        }
    }

Я просто запрашиваю изображение здесь через URL. Тем не менее, он должен запрашиваться динамически через пост WordPress. Я также пытался выполнить этот запрос JSON, но, к сожалению, пока не нашел решения

Заранее благодарю за помощь, так как я уже некоторое время ищу решение

1 Ответ

1 голос
/ 10 марта 2020

После обсуждения в чате мы нашли рабочее решение этой проблемы. Если у кого-то еще есть это, вы можете просто сделать это:

  1. Создайте две структуры, например Struct Response: Codable{}
  2. Создайте два массива, которые имеют типы структур, такие как: var arr:[Response] = []
  3. В ViewDidLoad вы вызовете метод getJsonData с блоком завершения.
  4. Когда данные загружаются в первый массив, вы вызываете метод getJsonImage с блоком завершения.
  5. Получив imageURL, вы можете просто извлечь его, создав URLSession для извлечения изображения.

Это код решения:

    //Arrays
    var firstArray:[FirstResponse] = []
    var imgData:[ImgData] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        //Fetching the JSON data
        fetchJSON {
            //Fetching the JSON image
            self.fetchJSONImage {
                let imageUrl = self.imgData[0].link
                self.imgView.downloaded(from: imageUrl)
            }
        }
    }

    //Retrieving the JSON data
    func fetchJSON(completed: @escaping () -> ()){
        var urlString = "HIDDEN"
        urlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!

        guard let url = URL(string: urlString) else {return}

        //Create the URLSession
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else{
                return
            }
            do{
                //Sets the dataArray to JSON data
                self.firstArray = [try JSONDecoder().decode(FirstResponse.self, from: data)]

                //Complete task in background
                DispatchQueue.main.async {
                    completed()
                }
            }
            catch let jsonErr{
                print(jsonErr)
            }
        }.resume()
    }

    //Retrieving the image link from JSON
    func fetchJSONImage(completed: @escaping () -> ()){
        let imgPath = firstArray[0].featured_media

        var urlString = "HIDDEN-URL\(imgPath)"
        urlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!

        guard let url = URL(string: urlString) else {return}

        //Create the URLSession
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else{
                return
            }
            do{
                //Sets the dataArray to JSON data
                self.imgData = [try JSONDecoder().decode(ImgData.self, from: data)]

                //Complete task in background
                DispatchQueue.main.async {
                    completed()
                }
            }
            catch let jsonErr{
                print(jsonErr)
            }
        }.resume()
    }

}

//Struct for getting image ID
struct FirstResponse: Codable{
    let featured_media: Int
}

//Struct for getting the image link
struct ImgData: Codable{
    let link: String
}

//Extension
extension UIImageView {

    //Download the image from the API
    func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleToFill) {
        contentMode = mode
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let image = UIImage(data: data)
                else { return }

            //Continue in background
            DispatchQueue.main.async() {
                self.image = image
            }
        }.resume()
    }
    func downloaded(from link: String, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
        guard let url = URL(string: link) else { return }
        downloaded(from: url, contentMode: mode)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...