2016-11-29 3 views
0

У меня возникла следующая проблема: мне нужно получить массив URL-адресов из объекта JSON, чтобы загрузить все изображения продуктов с сайта электронной коммерции в моем приложении.Как создать массив URL-адресов с SwiftyJSON и Alamofire?

JSON я получаю выглядит следующим образом:

[ 
{ 
........ 
........ 
......... 
........ 
"images": [ 
    { 
    "id": 976, 
    "date_created": "2016-08-10T15:16:49", 
    "date_modified": "2016-08-10T15:16:49", 
    "src": "https://i2.wp.com/pixan.wpengine.com/wp-content/uploads/2016/07/canasta-familia.jpg?fit=600%2C600&ssl=1", 
    "name": "canasta-familia", 
    "alt": "", 
    "position": 0 
    } 
], 
....... 
....... 
....... 

До сих пор я был в состоянии получить только один строку из массива делают это.

Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers) 
     .responseJSON { response in 
if let jsonValue = response.result.value { 
       let jsonObject = JSON(jsonValue) 
       var jsonArray = jsonObject[0]["images"][0]["src"].stringValue 
       print(jsonArray) 
    } 
} 

, который дает мне эту

https://xx.xx.xx/xxxx.xxxxx.xxxx/xx-xxxxx/uploads/2016/07/canasta-familia.jpg?fit=600%2C600&ssl=1 

Но что мне нужно, чтобы получить доступ к всем элементам внутри «изображения» & «Src» не только первый элемент индекса обоих.

Как это сделать?

Любые идеи?

+0

Не могли бы вы загрузить весь набор данных JSON где-нибудь? –

ответ

1

Следующие строки кода должны работать, поскольку я проверил себя с фактическим набором данных.

import Alamofire 
import SwiftyJSON 

Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers) 
    .responseJSON { response in 
    if let jsonValue = response.result.value { 
     let jsonObject = JSON(jsonValue) 
     if let array = jsonObject.array { 
      for i in 0..<array.count { 
       if let images = array[i]["images"].array { 
        for i in 0..<images.count { 
         let src = images[i]["src"] 
         print(src) // save src in an array or whatever 
        } 
       } 
      } 
     }  
    } 
+0

У меня возникает следующая проблема: Type 'Bool' не соответствует протоколу ' Последовательность»это происходит в начале цикла в инструкции:.? для г в 0

+0

это звучит как вопрос Alamofire Какова ваша версия Alamofire под какой версии Xcode –

+0

Alamofire 4,0 Xcode 8.1 –

3

Шаг 1:

Создание пользовательского объекта для представления изображений. Мы будем называть это «Картинкой».

struct Picture { 

    let id:Int 
    let date_created:String 
    let date_modified:String 
    let src:String 
    let name:String 
    let alt:String 
    let position:Int 
} 

Шаг 2:

Создать массив для хранения всех ваших фотографий продукта. Обязательно обратите внимание на область, в которой вы ее создаете. Он должен идеально за пределами вашей функции загрузки.

var productPictures = [Picture]() 

Шаг 3:

Скачать файл в формате JSON, сделать рисунок-структуру для каждого изображения, а также добавить каждую картину в массив productPictures.

Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers) 
     .responseJSON { response in 

      switch response.result { 
      case .success: 

       self.productPictures.removeAll() 

       guard let json = response.result.value as? [String:Any] else { 
        print("couldn't retrieve json as a dictionary") 
        return 
       } 

       guard let images = json["images"] as? [AnyObject] else { 
        print("there was a problem accessing the images key") 
        return 
       } 

       for image in images { 

        guard let id = image["id"] as? Int, 
          let date_created = image["date_created"] as? String, 
          let date_modified = image["date_modified"] as? String, 
          let src = image["src"] as? String, 
          let name = image["name"] as? String, 
          let alt = image["alt"] as? String, 
          let position = image["position"] as? Int 
        else { 
         print("There was a problem accessing one of the picture variables, or it was missing") 
         continue 
        } 

        let newPicture = Picture(id: id, 
              date_created: date_created, 
              date_modified: date_modified, 
              src: src, 
              name: name, 
              alt: alt, 
              position: position) 

        self.productPictures.append(newPicture) 
       } 
      case .failure(let error): 
       print("could not download and retrieve product images. An error occurred: \(error)") 
       return 
      } 
    } 

Теперь у вас есть массив, полный структур рисунков, каждый из которых содержит всю необходимую информацию, извлеченную из вашей загрузки JSON.

Примечание

Это не использует SwiftyJSON, но он должен работать и дать вам тот же предполагаемый результат. Надеюсь, это поможет!

+0

Это выглядит как удивительное решение. Я попробую это завтра, спасибо вам большое! –

+0

Добро пожаловать! Я надеюсь, что это помогает. – user3353890

+0

по какой-то причине я получаю это сообщение об ошибке. («не удалось получить json в качестве словаря») –

Смежные вопросы