Select platform: [HTML5](https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/multiple-requests.md.txt "View this page for the HTML5 platform docs.") [Android](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/multiple-requests.md.txt "View this page for the Android platform docs.") [iOS](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/multiple-requests.md.txt "View this page for the iOS platform docs.") [tvOS](https://developers.google.com/interactive-media-ads/docs/sdks/tvos/client-side/multiple-requests.md.txt "View this page for the tvOS platform docs.")

<br />

Most uses of the IMA SDK only require managing a single ad request at a time. However some edge case implementations, such as preloading ad data before the user selects a video, may require making multiple concurrent requests. Since ad requests are made asynchronously, ensuring the proper ad manager is associated with the correct context can seem to be a daunting task.

To simplify the process of differentiating multiple ad managers, the IMA SDK for iOS allows publishers to pass in any value or object to the [UserContext](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes/IMAAdsRequest.md.txt#-initwithadtagurl:addisplaycontainer:avplayervideodisplay:pictureinpictureproxy:usercontext:) field of any ad request. This value or object can then be retrieved in the [AdsLoader:AdsLoadedWithData](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Protocols/IMAAdsLoaderDelegate.md.txt#-adsloader:adsloadedwithdata:) delegate function, via the [IMAAdsLoadedData](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes/IMAAdsLoadedData.md.txt) object's [userContext](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes/IMAAdsLoadedData.md.txt#usercontext) attribute.

## Example

    ...
      adsLoader = IMAAdsLoader(settings: nil)
      adsLoader.delegate = self

      let userContextA = {id: "Request A", element: videoElementA}
      let userContextB = {id: "Request B", element: videoElementB}
      let requestA = IMAAdsRequest(
            adTagUrl: ViewController.AdTagURLString,
            adDisplayContainer: adDisplayContainer,
            contentPlayhead: contentPlayhead,
            userContext: userContextA)
      let requestB = IMAAdsRequest(
            adTagUrl: ViewController.AdTagURLString,
            adDisplayContainer: adDisplayContainer,
            contentPlayhead: contentPlayhead,
            userContext: userContextB)
      adsLoader.requestAds(with: requestA)
      adsLoader.requestAds(with: requestB)

    ...

    // MARK: - IMAAdsLoaderDelegate

    func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
      let userContext = adsLoadedData.userContext
      print("Loaded ads for ID: " + userContext.id)
      adsManager = adsLoadedData.adsManager
      adsManager.initialize(with: nil)
    }

    func adsLoader(_ loader: IMAAdsLoader!, failedWith adErrorData: IMAAdLoadingErrorData!) {
      let userContext = adsLoadingErrorData.userContext
      print("Error loading ads for ID: " + userContext.id)
    }

    ...