func uploadImage()

in FBSDKGamingServicesKit/FBSDKGamingServicesKit/GamingImageUploader.swift [101:192]


  func uploadImage(
    with configuration: GamingImageUploaderConfiguration,
    completion completionHandler: @escaping GamingServiceResultCompletion,
    andProgressHandler progressHandler: GamingServiceProgressHandler?
  ) {
    let errorFactory = ErrorFactory()

    if AccessToken.current == nil {
      completionHandler(
        false,
        nil,
        errorFactory.error(
          code: CoreError.errorAccessTokenRequired.rawValue,
          userInfo: nil,
          message: "A valid access token is required to upload Images",
          underlyingError: nil
        )
      )

      return
    }

    guard let imageData = configuration.image.pngData() else {
      completionHandler(
        false,
        nil,
        errorFactory.error(
          code: CoreError.errorInvalidArgument.rawValue,
          userInfo: nil,
          message: "Attempting to upload a nil image",
          underlyingError: nil
        )
      )

      return
    }

    let connection = graphRequestConnectionFactory.createGraphRequestConnection()

    let uploader = GamingImageUploader(progressHandler: progressHandler)

    connection.delegate = uploader
    InternalUtility.shared.registerTransientObject(connection.delegate as Any)

    connection.add(
      GraphRequest(
        graphPath: "me/photos",
        parameters: [
          "caption": configuration.caption ?? "",
          "picture": imageData,
        ],
        httpMethod: .post
      )
    ) { [weak self] graphConnection, result, error in
      guard let strongSelf = self else { return }

      if let graphConnectionDelegate = graphConnection?.delegate {
        InternalUtility.shared.unregisterTransientObject(graphConnectionDelegate)
      }

      if error != nil || result == nil {
        completionHandler(
          false,
          nil,
          errorFactory.error(
            code: CoreError.errorGraphRequestGraphAPI.rawValue,
            userInfo: nil,
            message: "Image upload failed",
            underlyingError: error
          )
        )
        return
      }

      let result = result as? [String: Any]

      if !configuration.shouldLaunchMediaDialog {
        completionHandler(true, result, nil)
        return
      }

      let controller = strongSelf.factory.create(
        serviceType: .mediaAsset,
        pendingResult: result,
        completion: completionHandler
      )

      controller.call(withArgument: result?["id"] as? String)
    }

    connection.start()
  }