放在下一个runloop执行,保证当前执行正确

原创 2017年01月03日 10:57:36

遇到的问题是:播放下一个视频的时候,一直loading,研究了一下,使用下一个runloop解决
这里说一下视频播放的流程:
1. 获取视频地址URL
2. 根据URL获取视频缓冲
3. 当缓冲ok的时候,判断播放器state状态,当state == active的时候可以播放,stat = stop的时候不能播放。
下面从视频播放完成playToEnd开始说起:

/*视频播放完,开始下个视频播放*/
-(void)playToEnd {
    state = active;/*播放器state需要是active的,如果是stop的情况就不播放下一个视频了。这里预设state是active*/
    playNextVideo(state); 
    state = stop;/*由于playNextVideo用到了state,该行不能放到method之上*/
}

/*播放下一个视频*/
-(void) playNextVideo:(state ){
    /*异步联网操作,获取视频url地址.前提是state = active*/
    if(state == active){
        [NetWrok connectNetwork:^{
            startLoad();
        }];
    }
}

/*异步联网操作,根据地址获取一定缓冲*/
-(void) startLoad{
    state = active;
    startBuffer();
}

/*缓冲完成,开始播放画面*/
-(void) onBufferOK{
    if(state = active){
        play();
    }
}

正常逻辑:
看调用playNextVideo(state)这一行(第4行),由于这个函数获取视频url地址是异步的,程序会先执行state=stop。然后网络应答后再调用startLoad,此时state=active;今儿onBufferOK函数,也能调用play函数了;
出问题逻辑:
[NetWrok connectNetwork^{}}在由缓冲的情况下,不发起实际的网络请求。立即应答,导致startLoad立即被调用。然而第5行执行state=stop了。最后即便onBufferOK调用,但是state还是stop状态,并么有调用play函数。程序state 死锁了。
    
解决办法就是:
 在调用startLoad的那行加放到下一个runloop执行。保证playToEnd函数的第5行 state=stop先执行。代码如下:

/*播放下一个视频*/
-(void) playNextVideo:(state ){
    /*异步联网操作,获取视频url地址.前提是state = active*/
    if(state == active){
        [NetWrok connectNetwork:^{
            /*放到下一个runloop执行*/
            dispatch_async(dispatch_get_main_queue(),^{
                startLoad();
            });
        }];
    }
}

版权声明:原创文章,未经博主允许禁止转载。欢迎点击头像上方“郭晓东的专栏”查看专栏

相关文章推荐

activiti拿取 当前任务的下一个节点

在实际的工作流业务开发中, 当用户完成当前用户任务时, 需要指定下一个用户任务的审核人。此时我们需要获取下一个节点的一些信息, 来确定下一个用户任务的审核人有哪些。            ...

在项目中,如何根据当前的流水号,生成下一个流水号!

在项目中,如何根据当前的流水号,生成下一个流水号! DataType.java package cn.itcast.crm.util; import org.apache.commons.l...

自己写的小程序中密码和账号输入都正确,但是不能正确进入下一个界面

写了一个Java小程序,但是业务逻辑上出现了一些问题。具体的问题是当输入正确的密码与账号时依旧显示密码或者账号错误。经过csdn上的大神指点,查了一下==与equals的区别,并写了一个测试小程序,发...

【微软100题】n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数

package test; /** * 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 ...

Android如何执行一个不确定当前处于在子线程还是主线程中的UI操作

Android执行一个不确定当前处于在子线程还是主线程中的UI操作
  • canot
  • canot
  • 2016-01-25 10:28
  • 2366

从当前fragment或者activity跳到另一个activity,当返回时需要获得一些值或执行一些函数

相关函数: startActivityForResult(Intent intent, Int requestCode) setResut(int resultCode, Intent inten...
  • lxsjt
  • lxsjt
  • 2016-08-17 20:00
  • 110

一个runloop例子

  • 2012-12-26 14:27
  • 66KB
  • 下载

NStimer和Runloop之间的关系(NSTimer和其他事件同时显示执行)

IOS开发中NSRunloop跟NSTimer的问题 在Windows时代,大家肯定对SendMessage,PostMessage,GetMessage有所了解,这些都是windo...

如何正确结束驱动RunLoop的NSThread

不负责任的apple sample Apple的Sample说可以轮循线程是否应该退出,但是有bug see:documentation/Cocoa/Conceptual/Multithrea...

使用runloop阻塞线程的正确写法

转至:http://marshal.easymorse.com/archives/4700 runloop可以阻塞线程,等待其他线程执行后再执行。 比如: @implemen...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)