关闭

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

标签: runloop
806人阅读 评论(0) 收藏 举报
分类:

遇到的问题是:播放下一个视频的时候,一直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();
            });
        }];
    }
}

1
0
查看评论

CUDA 同步和异步

同步操作:主机向设备提交任务,主机将阻塞,直到设备将所提交任务完成,并将控制权交回主机。然后继续执行主机的程序。 异步操作:主机向设备提交任务,设备直接开始执行任务,但主机将不再阻塞,而是直接继续执行主机的程序。主机并不会等待设备执行任务完毕。 在CUDA当中,核函数kernel的执行总是异步的...
  • qq_17239003
  • qq_17239003
  • 2018-01-05 21:00
  • 29

runloop实现原理初解 和 使用runloop阻塞线程

现在说说runloop为何会成为cocoa开发中迷惑的点。因为很多新手没有从动态角度看它。 首先回想一下第2点介绍的runtime的概念。 接着我出一个题思考一下。    现在我有一个程序片段如下:  复制代码 - (void)myThread:(id)sen...
  • hanmingsa
  • hanmingsa
  • 2014-10-07 16:29
  • 889

mysql存储过程执行状态判断

MySQL中有两个函数来计算上一条语句影响了多少行,不同于SqlServer/Oracle,不要因为此方面的差异而引起功能问题: 1,判断Select得到的行数用found_rows()函数进行判断。 2,判断Update或Delete影响的行数用row_count()函数进行判断,这里...
  • cut001
  • cut001
  • 2018-02-01 16:37
  • 20

NSTimer详解----使用、保留环问题、与runloop的关系

一、使用NSTimer你需要了解的内容 (1)只有将计时器放在运行循环中,它才能正常的触发任务。 (2)NSTimer对象会保留target,直到计时器失效,调用invalidate可令其失效;一次性计时器触发完就失效 (3)反复执行的timer容易造成保留环。 (4)可以使用分类,用blo...
  • u011774517
  • u011774517
  • 2017-04-06 16:53
  • 308

RunLoop运行循环

RunLoop ——-一次偶然的机会和以前同事群里面聊天,他们要让我写一篇关于RunLoop的文章,作为内部分享所用,于是我就开始准备看了很多大量的资料,官方文档连接为: https://developer.apple.com/library/mac/documentation/Cocoa...
  • lifufa
  • lifufa
  • 2016-02-23 14:32
  • 799

当一个动画结束之后继续执行下一个动画

  • baohanqing
  • baohanqing
  • 2016-03-13 18:37
  • 773

iOS runloop与定时器的使用

runloop有五种工作模式 其中较为常用的是以下三种 kCFRunLoopDefaultMode--默认模式 UITrackingRunLoopMode--界面跟踪模式 NSRunLoopCommonModes --占位模式 每当用户拖拽界面时,runloop就会由默认模式,进入界面...
  • a359696929
  • a359696929
  • 2016-05-11 11:01
  • 2208

iOS开发 底层抛析运行循环—— RunLoop

一个线程对应一个runLoop,主线程的runloop是程序一启动,默认就创建一个runloop,创建好了之后就会给它添加一些默认的模式,每个模式里面会有很多的 source /timer/observer ,添加好这些模式后,observer就会监听主线程的runloop,进入runloop后,就...
  • zc639143029
  • zc639143029
  • 2015-11-24 14:36
  • 4019

iOS开发多线程-RunLoop

一、什么是RunLoop   1.从字面意思看     1)运行循环     2)跑圈   2.基本作用     1)保持程序的持续运行     2)处理Ap...
  • u011619223
  • u011619223
  • 2015-11-28 01:26
  • 2105

有三个线程,怎么让他们按顺序执行

第一种:         用Thread.join() 方法 确定该线程执行完毕 第二种 线程池   newSingleThreadExecutor  这个线程处理完一个任务后接着处理下一个任务   ...
  • quliangmao
  • quliangmao
  • 2017-11-29 16:07
  • 80
    个人资料
    • 访问:1202479次
    • 积分:9407
    • 等级:
    • 排名:第2308名
    • 原创:171篇
    • 转载:44篇
    • 译文:16篇
    • 评论:131条
    博客专栏
    最新评论