我正在尝试从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);
}
});
它基本上是一个带有completionHandler的NSUrlSession
downloadTask
任务。我知道如何实现第一部分,但我不知道完成处理程序的语法是什么,我无法在网上找到它。这就是我所拥有的:
let session : NSUrlSession = NSUrlSession.SharedSession
let request : NSUrlRequest = NSUrlRequest.FromUrl(url)
let downloadTask : NSUrlSessionDownloadTask = session.CreateDownloadTask(request, ??????)
答案 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
- 我不确定您调用了哪些重载,因此您需要检查该代码。