NSURLSession下载任务 - Xamarin iOS F#

时间:2018-01-29 18:24:04

标签: c# f# xamarin.ios nsurlsession completionhandler

我正在尝试从C#中的F# 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, ??????)

1 个答案:

答案 0 :(得分:2)

在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 - 我不确定您调用了哪些重载,因此您需要检查该代码。