0

Anyone know if it is possible, using gomobile bind, to implement some sort of delegate behaviour when exporting to iOS?

i.e. i have a go library that handles network requests for an iOS app, and i need it to be done asynchronously so that it doesn't hang the app.

Solutions would be to either send a objc completion block (which i don't think will work, since i have found no way to send objc code back into the go function) or implement some sort of delegate so that the app can know when the request has finished. I have tried everything I could think of... Any ideas? Thanks!

Daniel Ruhman
  • 123
  • 2
  • 13

1 Answers1

2

Turns out it is possible!

Here is the Go Code:

type NetworkingClient struct {}

func CreateNetworkingClient() *NetworkingClient {
    return &NetworkingClient {}
}

type Callback interface {
    SendResult(json string)
}

func (client NetworkingClient) RequestJson (countryCode string, callback Callback) {
    go func () {
    safeCountryCode := url.QueryEscape(countryCode)
    url := fmt.Sprintf("someApi/%s", safeCountryCode)

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        //Handle error
    }

    httpClient := &http.Client{}

    resp, err := httpClient.Do(req)
    if err != nil {
        //Handle error
    }

    defer resp.Body.Close()
      b, err := ioutil.ReadAll(resp.Body)
      callback.SendResult(string(b))
        }()
  }

Which is implemented as follow in Objetive-C:

- (void)start {

    ...

    EndpointNetworkingClient* client = EndpointCreateNetworkingClient();
    [client requestJson:countryCode callback:self];
}

//Receives the json string from Go.
- (void)sendResult:(NSString*)json{
    NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding];
    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    [self handleResponse:jsonDictionary];
}
Daniel Ruhman
  • 123
  • 2
  • 13