Как сохранить JSONdata из API-вызова (GET) для последующего использования для API-запроса (PUT)?

Это то, что я пытаюсь выполнить:

  1. Используйте сканер штрих-кода для сканирования элемента и отправки «GET REQUEST» для получения данных json.
  2. Измените данные с помощью пользовательского ввода (измените номер, текст и т. д.).
  3. Используйте измененные данные/переменную для отправки «PUT REQUEST» как httpbody.

Я не знаю, как лучше всего это сделать, я так потерян! Могу ли я каким-то образом вернуть переменную «параметры» из функции, чтобы я мог изменить ее и отправить с помощью другой функции?

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

Спасибо за проверку, просто ищу кого-то, кто укажет мне правильное направление.

import UIKit
import AVFoundation
import QRCodeReader
import Alamofire

// MARK: - Main
struct Main: Codable {
    let objects: [Object]
}


// MARK: - Object
struct Object: Codable {
    let inventory: [Inventory]
}


// MARK: - Inventory
struct Inventory: Codable {
    let coordinates: String

}





    func test() {
        
        // MARK: - LOGIN DETAILS
        let headers: HTTPHeaders = [
            .authorization(username: "username", password: "password"),
            .accept("application/json")]
        
        // MARK: - API REQUEST
        AF.request("URL LINK", headers: headers).validate().responseJSON { response in
            
            // MARK: - CHECK FOR ERRORS
            if let error = response.error {
                print(error)
                
                // MARK: - ERROR MESSAGE
                DispatchQueue.main.async
                { let alert = UIAlertController(title: "ERROR", message: "Something went wrong", preferredStyle: .alert)
                    
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                    
                self.present(alert, animated: true)}
                return}
            
            // MARK: - PRINT RESPONSE
            if response.response != nil
            {print (response.response!) }
            
            // MARK: - PRINT DATA
            if response.data != nil
            { print(response.data!)
              let decoder = JSONDecoder()
               do
            {
                let api = try decoder.decode(Main.self, from: response.data!)
                
                let parameters = [
                        "meta": [
                            "language": "en"
                        ],
                        "request": [
                             "inventory": [
                            [
                                "id": 6534206,
                                "warehouseid": 1,
                                "instock": 3,
                                "threshold": 0,
                                "reserved": 0,
                                "coordinates": "\(api.objects[0].inventory[0].coordinates)",
                                "note": "",
                                "prodno": 25669,
                                "soldout": 0
                            ]
                        ]
                        ]
                ]
                
            }
               
               catch {
                   print("Error in JSON parsing")
               }
                
            }
            
            
        }
    }


Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать замыкание, чтобы вернуть значение из функции. Эта практика является функциональным программированием, почти с использованием асинхронной функции.

func test(completion: ([String: AnyObject]) -> ()) {
    ...
    let param = [“meta”: [“language”: “en”],...]
    completion(param)
}

И затем, чтобы использовать его:

test(completion: { param in
    // handle the “param”
})

Привет! Спасибо, что нашли время, чтобы помочь мне. Я пробовал приведенный выше код, но получаю следующую ошибку при вводе «completion (param) ---- Не удается преобразовать значение типа «[String: [String: Any]]» в ожидаемый тип аргумента «[String: AnyObject]» , как я могу решить эту проблему?

Axxi 26.12.2020 16:49

Давайте попробуем func test(completion: ([String: Any]) -> ()) { ... }. Вы можете изменить [String: Any] на тип значения ответа, которое вы хотите получить за пределами этой функции @Axxi.

Hai Pham 26.12.2020 17:01

Привет! Это сработало, но это не совсем то, что я искал. Я хочу, чтобы одна кнопка "получала" данные, а другая - "помещала" данные (но измененные). Обработчик завершения делает эту работу, если я использую только 1 кнопку, но мне нужно 2 кнопки, как мне это сделать?

Axxi 26.12.2020 21:03

Вам нужно сохранить параметр как локальную переменную класса. Например: у вас есть ViewControllerA, он содержит 2 кнопки. Первая кнопка вызовет test(), а затем получит параметр, назначит его существующей локальной переменной, которую вы только что определили. Затем кнопка 2 будет использовать эту локальную переменную

Hai Pham 27.12.2020 03:38

Определите что-то подобное в своем классе: private var paramData: [String: Any]? = ноль. В завершении test() просто присвойте ему параметр: paramData = param

Hai Pham 27.12.2020 03:58

Спасибо бро, сработало. Я очень ценю время, которое вы потратили, чтобы помочь мне <3

Axxi 27.12.2020 10:28

Другие вопросы по теме