Search code examples
iosswiftgetrequestsynchronization

Swift multiple requests return the same result


Im making synchronous api calls to an API and in the debugger I see that I am getting different results. However my code always returns the same Id:

func fetchIDbySKU(name: String, color: String) -> Data{
    
    
    let sku = name + ":" + color
    let appendedsku = (sku).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
    let url: String = "https://www.link.com/wp-json/wc/v1/products?sku=" + appendedsku!

    let semaphore = DispatchSemaphore (value: 0)

    var result = Data()
    
    var request = URLRequest(url: URL(string: url)! ,timeoutInterval: Double.infinity)
    request.addValue("Basic secret token", forHTTPHeaderField: "Authorization")

    request.httpMethod = "GET"

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else {
            print(String(describing: error))
            return
        }
        
        print(String("______________________________________"))
        print(String(data: data, encoding: .utf8)!)
        result = data
        print(String("______________________________________"))
        semaphore.signal()
    }

    task.resume()
    semaphore.wait()
    return result
  }

so result is always returning the same result even though I in the console I an see that the response data is different.

This is the code where I am expecting the return:

var request_data = fetchIDbySKU(name: name, color: color_name)
        var product_id = String(request_data[0])
        
        parts_list.append(Item(product_id: product_id, quantity: quantity))

Solution

  • Your semaphore is initialized every time the function is called. Just take out the initialization of your semaphore out of the function and it will work fine.

        let semaphore = DispatchSemaphore (value: 0)
        
        func fetchIDbySKU(name: String, color: String) -> Data{
        
        
        let sku = name + ":" + color
        let appendedsku = (sku).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        let url: String = "https://www.link.com/wp-json/wc/v1/products?sku=" + appendedsku!
    
        var result = Data()
        
        var request = URLRequest(url: URL(string: url)! ,timeoutInterval: Double.infinity)
        request.addValue("Basic secret token", forHTTPHeaderField: "Authorization")
    
        request.httpMethod = "GET"
    
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data else {
                print(String(describing: error))
                return
            }
            
            print(String("______________________________________"))
            print(String(data: data, encoding: .utf8)!)
            result = data
            print(String("______________________________________"))
            semaphore.signal()
        }
    
        task.resume()
        semaphore.wait()
        return result
      }