Drewby80
Drewby80

Reputation: 31

Struggling to parse NSArray to a string with delimiter to produce a QR code in swift

Hi I am currently trying to parse a JSON array produced by alamofire as below:

[
    {
        "UUID": "31ea524c-4d19-46f7-b3ec-c9264f9dbc78"
    },
    {
        "UUID": "d0c89800-bbae-4189-88ab-503c6b68b511"
    }
]

I need to take these values and present them as a comma delimited string so they look like this:

"31ea524c-4d19-46f7-b3ec-c9264f9dbc78, d0c89800-bbae-4189-88ab-503c6b68b511"

 Alamofire.request(URL_GET_ORDER, method: .post, parameters: parameters).responseJSON
            {
                response in
                //printing response
                print(response)

                if let result = response.result.value {

                    let jsonData = result as! NSArray


                 }

I need to take the data from the above array pass it to a string and then input that sting into this code to produce a QRcode that can then be scanned as part of a click and collect system:

let myString = "*JOINED STRING GOES HERE*"
        // Get data from the string
        let data = myString.data(using: String.Encoding.ascii)
        // Get a QR CIFilter
        guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return }
        // Input the data
        qrFilter.setValue(data, forKey: "inputMessage")
        // Get the output image
        guard let qrImage = qrFilter.outputImage else { return }
        // Scale the image
        let transform = CGAffineTransform(scaleX: 10, y: 10)
        let scaledQrImage = qrImage.transformed(by: transform)
        // Do some processing to get the UIImage
        let context = CIContext()
        guard let cgImage = context.createCGImage(scaledQrImage, from: scaledQrImage.extent) else { return }
        let processedImage = UIImage(cgImage: cgImage)

        self.myImageView.image = processedImage

I have already tried a lot of solutions like the following one below:

let stringRepresentation = jsonData.joinWithSeparator("-")

and:

let objCArray = NSMutableArray(array: jsonData)

                let swiftArray = objCArray as NSArray as? [String]


                print(swiftArray ?? "BrokeAgain!!") // returns nil


                let nustr = swiftArray?.joined(separator:",")

Upvotes: 0

Views: 136

Answers (1)

Andrey Gershengoren
Andrey Gershengoren

Reputation: 916

The easiest way is to start with Codable data model which represents a single object in your json array.

struct ResponseObject: Codable {
    let uuid: String
}

Then you can decode the plain response data into an array of objects – it's easier to work with.

func getUUIDList(_ complection: @escaping (String?) -> Void) {
    Alamofire
        .request(URL_GET_ORDER, method: .post, parameters: parameters)
        .response { response in
            guard let data = response.data else {
                completion(nil)
                return
            }

            do {
                let decoder = JSONDecoder()
                let objects = try decoder.decode([ResponseObject].self, from: data)
                completion(
                    objects
                        .map { $0.uuid }
                        .joined(separator: ", ")
                )
            } catch let error {
                print(error)
                completion(nil)
            }
    }
}

Finally replace your call Alamofire.request(URL_GET_ORDER, method: .post, parameters: parameters)... with:

// somewhere you call the alamofire
getUUIDList() { responseString in
    guard let responseString = responseString else { return }

    // Get data from the string
    let data = responseString.data(using: String.Encoding.ascii)
    // Get a QR CIFilter
    guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return }
    // Input the data
    qrFilter.setValue(data, forKey: "inputMessage")
    // Get the output image
    guard let qrImage = qrFilter.outputImage else { return }
    // Scale the image
    let transform = CGAffineTransform(scaleX: 10, y: 10)
    let scaledQrImage = qrImage.transformed(by: transform)
    // Do some processing to get the UIImage
    let context = CIContext()
    guard let cgImage = context.createCGImage(scaledQrImage, from: scaledQrImage.extent) else { return }
    let processedImage = UIImage(cgImage: cgImage)

    self.myImageView.image = processedImage
}

Please note, this is just a not testet guideline how you should do it. Do not expect the code will work after copy&paste, but is's a good starting point :)

Upvotes: 1

Related Questions