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 下载任务 - Xamarin iOS F#
AFNetworking/NSURLSession耗时长创建100多个任务下载文件