NSURLSession 下载任务 - Xamarin iOS F#

NSURLSession Download Task - Xamarin iOS F#

我正在尝试从 F# 中的 C# Xamarin.IOS 实现以下方法:

NSUrlSession.SharedSession.CreateDownloadTask(Request, (data, response, error) => 
    {
        if(response == null)
        {
            Client.FailedWithError(this, error);
        }
        else
        {
            Client.ReceivedResponse(this, response, NSUrlCacheStoragePolicy.Allowed);
            Client.DataLoaded(this, data);
            Client.FinishedLoading(this);
        }
    });

https://developer.xamarin.com/api/member/MonoTouch.Foundation.NSUrlSession.CreateDataTask/p/MonoTouch.Foundation.NSUrlRequest/MonoTouch.Foundation.NSUrlSessionResponse/

它基本上是一个带有 completionHandler 的 NSUrlSession downloadTask 任务。我知道如何实现第一部分,但我不知道完成处理程序的语法是什么,而且我在网上找不到它。这就是我所拥有的:

let session : NSUrlSession = NSUrlSession.SharedSession
let request : NSUrlRequest = NSUrlRequest.FromUrl(url)
let downloadTask : NSUrlSessionDownloadTask = session.CreateDownloadTask(request, ??????)

在 F# 中,您可以使用 fun ... -> ... 语法创建 lambda 函数。就像在 C# 中一样,在大多数情况下,这将自动转换为适当的委托,但如果您需要显式创建委托,则可以使用 MyDelegate(fun ... -> ...).

我没有安装 Xamarin iOS,但我的猜测是以下应该有效:

NSUrlSession.SharedSession.CreateDownloadTask(Request, fun data response error ->
  if (response = null) then
    Client.FailedWithError(this, error)
  else
    Client.ReceivedResponse(this, response, NSUrlCacheStoragePolicy.Allowed)
    Client.DataLoaded(this, data)
    Client.FinishedLoading(this)
)

在 F# 中,函数的参数由空格分隔(而不是逗号),除非您显式采用元组,普通委托不应如此。

如果您需要指定重载(因为 F# 无法自动推断),那么您可以使用:

NSUrlSession.SharedSession.CreateDownloadTask
  (Request, NSUrlSessionResponse(fun data response error ->
  // ...
  ) 
)

假设您要创建的委托是 NSUrlSessionResponse - 我不确定您调用的是哪个重载,因此您需要检查一下。