近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的,
当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都会做一次验证,向服务端获取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垃圾,活学活用,就好了