C# Xamarin:如何将数据从Xamarin iOS项目的NSUrlSession任务返回到共享项目?
我在Xamarin iOS项目中有一门课,比如:C# Xamarin:如何将数据从Xamarin iOS项目的NSUrlSession任务返回到共享项目?,c#,xamarin,nsurlsession,nsurlsessiondownloadtask,C#,Xamarin,Nsurlsession,Nsurlsessiondownloadtask,我在Xamarin iOS项目中有一门课,比如: public class NetworkUtility : INetworkUtility { public void GetData() { NSUrl url = new NSUrl("https://reqres.in/api/users?page=2"); NSUrlRequest request = new NSUrlRequest(url); NSUrlSession
public class NetworkUtility : INetworkUtility
{
public void GetData()
{
NSUrl url = new NSUrl("https://reqres.in/api/users?page=2");
NSUrlRequest request = new NSUrlRequest(url);
NSUrlSession session = null;
NSUrlSessionConfiguration myConfig = NSUrlSessionConfiguration.DefaultSessionConfiguration;
myConfig.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;
session = NSUrlSession.FromConfiguration(myConfig);
NSUrlSessionTask task = session.CreateDataTask(request, (data, response, error) => {
Console.WriteLine(data);
});
task.Resume();
}
}
我用一些Xaml代码从共享项目中调用它,比如:
DependencyService.Get<INetworkUtility>().GetStringData();
如何将此数据返回给调用者(即,返回到后面的Xaml代码)
如果我将GetData()
函数的返回类型更改为string或Task,并尝试在lambda表达式中返回,则会出现编译错误
我读到很多论坛都说我需要实现一个NSUrlDelegate来处理响应。我为此尝试了多种变体,但没有成功。请告知
另外,(我认为这是不可能的,也不是正确的方法),但有没有一种方法可以将整个NSUrlSession返回到共享项目,并从共享项目本身调用数据任务方法?有一个简单的解决方案。在
INetworkUtility
接口中声明GetData()
方法如下:
Task<string> GetData();
Task<string> dataTask = DependencyService.Get<INetworkUtility>().GetData();
await Task.WhenAny(dataTask, Task.Delay(10000)); // 10.000ms timeout
if(dataTask.IsCompletedSuccessfully) {
//all good:
string dataString = dataTask.Result;
}else{
//we hit the time limit
}
工作得很有魅力。谢谢你的帮助。但是这个例子不起作用:Task dataTask=DependencyService.Get().GetData();它说“无法将类型'string'隐式转换为'System.Threading.Task.Task'。但我想我会计算这一部分。感谢TaskCompletionSource部分。此错误消息表示您没有更改
GetData()
签名到任务
而不是字符串
,或者您在该行中使用了等待
关键字。在本例中,等待
关键字意味着您不希望任务
对象返回,该对象保存有关正在进行的任务的信息,而希望“等待”“对于字符串结果,只有当任务完成时,您才希望继续执行。哇..”。。抢手货即使在超时的情况下,我也没有删除“wait”关键字。再次感谢。你真棒!
public Task<string> GetData()
{
TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
NSUrl url = new NSUrl("https://reqres.in/api/users?page=2");
NSUrlRequest request = new NSUrlRequest(url);
NSUrlSession session = null;
NSUrlSessionConfiguration myConfig = NSUrlSessionConfiguration.DefaultSessionConfiguration;
myConfig.MultipathServiceType = NSUrlSessionMultipathServiceType.Handover;
session = NSUrlSession.FromConfiguration(myConfig);
NSUrlSessionTask task = session.CreateDataTask(request, (data, response, error) => {
//Console.WriteLine(data);
//tell the TaskCompletionSource that we are done here:
tcs.TrySetResult(data); //assuming data is a string but i guess you can convert it if not
});
task.Resume();
return tcs.Task;
}
public async Task ReceiveDataShared() {
string yourData = await DependencyService.Get<INetworkUtility>().GetData();
}
Task<string> dataTask = DependencyService.Get<INetworkUtility>().GetData();
await Task.WhenAny(dataTask, Task.Delay(10000)); // 10.000ms timeout
if(dataTask.IsCompletedSuccessfully) {
//all good:
string dataString = dataTask.Result;
}else{
//we hit the time limit
}