NSURLSession 下载任务 - Xamarin iOS F#

Posted

技术标签:

【中文标题】NSURLSession 下载任务 - Xamarin iOS F#【英文标题】:NSURLSession Download Task - Xamarin iOS F# 【发布时间】:2018-01-29 18:24:04 【问题描述】:

我正在尝试从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, ??????)

【问题讨论】:

【参考方案1】:

在 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 - 我不确定您调用的是哪个重载,因此您需要检查一下。

【讨论】:

如何从闭包中返回一个值?我将所有这些代码嵌入到必须返回UIImage 的方法中。图像当前正在闭包中生成,我必须能够返回它。我已经用我目前的方式更新了问题,但是,我认为这是不正确的,因为闭包将在方法的其余部分之后执行,因为闭包必须首先等待下载完成 @Alk 我认为最好将其作为一个单独的问题来回答 - 请提供有关您想对该值做什么的所有详细信息。 ***.com/questions/48520528/…

以上是关于NSURLSession 下载任务 - Xamarin iOS F#的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 后台任务:避免重复

NSURLSession 下载任务 - Xamarin iOS F#

AFNetworking/NSURLSession耗时长创建100多个任务下载文件

使用 NSURLSession 如何在取消下载任务时获取接收到的数据或临时文件位置

NSURLSession 后台断点下载

NSURLSession,多数据任务,completionHandler