给UnityWebRequest添加Awaiter
有什么不明白的地方,扫描右方二维码加我微信交流。
UnityWebRequest使用很方便,但是SendRequest方法不能await,只能在协程里调用,如何使得SendRequest可以await呢?
使一个对象可以await,这个对象必须有GetAwaiter方法,GetAwaiter方法里返回一个和异步操作完成状态的对象,这个对象必须实现3个方法:
- IsCompleted
- GetResult
- OnCompleted
必须继承:INotifyCompletion
IsCompleted会在await时调用,如果返回false,则调用OnCompleted方法给continuation赋值,在构造这个对象时传入实现异步操作的对象,给异步操作对象的completed方法再添加一个OnRequestCompleted,实际上就是当异步操作完成时,从这里通知出去。通知出去后,会调用GetResult方法,此方法可以给await返回值,如果不写,则返回空值。
代码如下:
using System;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.Networking;
public class UnityWebRequestAwaiter : INotifyCompletion
{
private UnityWebRequestAsyncOperation asyncOp;
private Action continuation;
public UnityWebRequestAwaiter(UnityWebRequestAsyncOperation asyncOp)
{
this.asyncOp = asyncOp;
asyncOp.completed += OnRequestCompleted;
}
public bool IsCompleted { get { return asyncOp.isDone; } }
public void GetResult() { }
public void OnCompleted(Action continuation)
{
this.continuation = continuation;
}
private void OnRequestCompleted(AsyncOperation obj)
{
continuation();
}
}
public static class ExtensionMethods
{
public static UnityWebRequestAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)
{
return new UnityWebRequestAwaiter(asyncOp);
}
}