近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的,

当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都会做一次验证,向服务端获取token验证信息,来确保非法上传,如果不做这个那么会有非法用户上传非法图像,使你的服务器

带来未知的灾难。

而验证的逻辑很好写,并没有什么难度,比如:

Server.SendMessage("获取token");
Client.Receive(string token)
{
    Print(token);
    if(token != 本地token)
   {
         Server.SendMessage("获取token");重新获取token   }
}

看样子很简单,可是一般客户端在接收服务端回过来的消息时,都会有一个协议分发的阶段,然后你的接收token的代码就会放到协议分发的那里,或者在协议分发的地方去调用,如果严重不通过,

重新走一遍这个流程,一直到严重用过,有点类似递归,是不是感觉有点傻傻的方式?

确实,这样做很不优雅,如果不做好注释的话,会让人摸不到头绪,下面用一个很不错的办法来实现,那就是使用协程

/// <summary>
/// 用于获取token的迭代器对象
/// </summary>
public class TokenVerificationOperation : IEnumerator {
    public bool MoveNext(){
        //Debug.logger.Log(IsDown);
        return !IsDown;
    }
    public TokenVerificationOperation() {
        ZoneServerRequeset.SendPortraitTokenReq();
    }
    public void Reset(){

    }
    public void OnToken(string token){
        IsDown = true;
        Token = token;
    }
    public bool IsDown { get; set; }
    public string Token { get; set; }
    public object Current { get { return null; } }
}

使用时候

public IEnumerator TokenJY()
{
    TokenOperation = new TokenVerificationOperation();
    yield return mb.StartCoroutine(TokenOperation);    if(TokenOperation .Token){
        StartCoroutine(TokenJY);
   }
}

是不是感觉这个办法,很不错,至少不用到处写代码到处找了,直接一个函数里面搞定,其实原理很简单,Unity协程里面会主动调用实现IEnumerator (迭代器)的MoveNext函数,咱们就去实现这个接口

然后在MoveNext函数里面去判断服务端的消息是否返回了,这样再通过yeild配合,使流程简单化。也很通俗易懂,简单明了。

另提示:迭代器loop判断服务端回调的方式,不建议大规模使用,unity中,如果协程使用不当,每发起一次都会有一定的gc垃圾,活学活用,就好了