美文网首页
同步任务的插队实现笔记

同步任务的插队实现笔记

作者: 数字d | 来源:发表于2021-07-13 18:13 被阅读0次

在实现直播送礼物功能的过程中,遇到一种场景

每个gif假设执行时间是1.5秒,那么直播间如果同时有40个人送礼物,

那么观众端的页面1分钟之内都被gif动图占据

动图的播放又不能进行重叠,因此智能同步队列的方式

这种情况下需要舍弃一些用户的礼物gif

另外,对于发礼物的人来说,自己发礼物的gif展示优先级应该比其他人送礼物他接收到的gif要高

异步方案不能用,同步虽然能用,但是没办法插队(插队为了满足用户自己发送礼物的优先展示)

虽然不能够在任务队列中插队,但是可以将任务加进队列的时机进行排队

具体的实现方案核心代码:

#import "ViewController.h"


@interface ViewController ()
@property (nonatomic, strong) dispatch_queue_t q;
@property(nonatomic,assign)BOOL status;

@property(nonatomic, strong) NSMutableArray * heighArray;
@property(nonatomic, strong) NSMutableArray * lowArray;

@property(nonatomic,strong)UIButton * addLowBtn;
@property(nonatomic,strong)UIButton * addHeightBtn;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    self.status = NO;

    [self start];
    
//    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
//
//    pasteboard.string = @"http://192.168.0.26:8081/#/mobile/live";

    self.lowArray = [NSMutableArray arrayWithCapacity:0];
    self.heighArray = [NSMutableArray arrayWithCapacity:0];
    
    [self.view addSubview:self.addLowBtn];
    [self.view addSubview:self.addHeightBtn];
    
    NSLog(@"---------------原有的lowarray = %@ height array = %@",self.lowArray,self.heighArray);
}


-(void)start{
    //队列
    self.q = dispatch_queue_create("WT_queue1", DISPATCH_QUEUE_CONCURRENT);

    //任务
    void (^task)(void) = ^{
        self.status = YES;
        dispatch_async(self.q, ^{
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
               // 需要延迟执行的代码
                self.status = NO;
                [self judgeInfoAndStart];
            });

        });
    };
    
    dispatch_sync(self.q, task);
    
}

-(void)judgeInfoAndStart {
    if (!self.status) {
        NSLog(@"---------------判断 lowarray = %@ height array = %@",self.lowArray,self.heighArray);
        if (self.heighArray.count > 0) {
    //        self.operaHeight = YES;
            [self.heighArray removeObject:self.heighArray.firstObject];
    //        self.operaHeight = NO;
            [self heightTaskInfo];
            //根据firstobject来创建任务,加入队列中直接执行
        }else {
            if (self.lowArray.count > 0) {
                
                [self lowTaskInfo];

    //            self.operaLow = YES;
                //根据firstobject来创建任务,加入队列中直接执行
                NSLog(@"origin low array = %@",self.lowArray);
                [self.lowArray removeObjectAtIndex:0];
                NSLog(@"current  low array = %@",self.lowArray);
    //            self.operaLow = NO;
                
                
            }
        }
    }
 
}

-(void)heightTaskInfo{
    //任务
    void (^task)(void) = ^{
        self.status = YES;
        dispatch_async(self.q, ^{
            for (int i=0; i< 10; i++) {
                NSLog(@"--------------------------新增一个高优先级级任务 %d",i);
            }
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
               // 需要延迟执行的代码
                self.status = NO;
                [self judgeInfoAndStart];

            });

        });
    };
    
    dispatch_sync(self.q, task);
}


-(void)lowTaskInfo {
    //任务
    void (^task)(void) = ^{
        self.status = YES;
        dispatch_async(self.q, ^{
            for (int i=0; i< 10; i++) {
                NSLog(@"++++++++新增的一个低的优先级任务任务 %d",i);
            }
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
               // 需要延迟执行的代码
                self.status = NO;
                [self judgeInfoAndStart];
            });
        });
    };
    
    dispatch_sync(self.q, task);
}


-(void)lowAction {
//    if(self.operaLow){
//        [self lowAction];
//    }else {
        [self.lowArray addObject:@(1)];
    
        NSLog(@"---------------当前lowarray = %@ height array = %@",self.lowArray,self.heighArray);
    if(self.lowArray.count > 10){
        [self.lowArray removeObjectsInRange:NSMakeRange(1, 8)];
    }
//    }
    
    if (!self.status) {
        [self judgeInfoAndStart];
    }
}

-(UIButton *)addHeightBtn {
    if (_addHeightBtn == nil) {
        _addHeightBtn = [UIButton buttonWithType:(UIButtonTypeCustom)];
        _addHeightBtn.frame = CGRectMake(50, 280, 100, 50);
        [_addHeightBtn setTitle:@"加高" forState:(UIControlStateNormal)];
        _addHeightBtn.backgroundColor = [UIColor blueColor];
        [_addHeightBtn addTarget:self action:@selector(heightAction) forControlEvents:(UIControlEventTouchUpInside)];
        
    }
    return _addHeightBtn;
}

-(void)heightAction {
    NSLog(@"点击了抢占队列按钮");
    
//    if (_operaHeight) {
//        [self heightAction];
//    }else {
        [self.heighArray addObject:@(1)];
        NSLog(@"---------------当前lowarray = %@ height array = %@",self.lowArray,self.heighArray);

//}
    
    if (!self.status) {
        [self judgeInfoAndStart];
    }
    
}


@end

相关文章

  • 同步任务的插队实现笔记

    在实现直播送礼物功能的过程中,遇到一种场景 每个gif假设执行时间是1.5秒,那么直播间如果同时有40个人送礼物,...

  • 【前端】interview时碰到的js手写题

    *多个实现异步的方法 Promise.all(iterable)实现,同步执行完所有参数里的promise任务,再...

  • JS事件循环机制

    1. 同步任务与异步任务 所有的任务可以分为同步任务和异步任务。 同步任务就是立即执行的任务,同步任务一般会直接进...

  • GCD实现异步任务的同步处理

    前言 标题可能有点词不达意了,但内容应该是大部分开发都会遇到的问题。面试时或开发中可能会遇到:有A,B,C,D四个...

  • c++同步任务队列的实现

     代码来源[1]。  之前有分析过webrtc中invoke函数的实现[2]。[1] TaskLoop.cpp[2...

  • JavaScript的执行机制

    一、重要理论 1、JavaScript是单线程语言,所有任务都是同步执行的。但是可以通过同步的方法实现异步执行...

  • 线程同步辅助类(一)

    java中基本的同步机制有synchronized,Lock等,这些机制可以实现并发任务共享一个资源时的同步...

  • Spring Event事件通知机制 源码学习

    笔记简述本学习笔记主要是介绍Spring中的事件通知是如何实现的,同步和异步事件通知的用法和实现细节以及Sprin...

  • HI3861学习笔记(7)——LiteOS(CMSIS-RTOS

    一、简介 1.1 信号量 信号量(Semaphore) 是一种实现任务间通信的机制,实现任务之间同步或临界资源的互...

  • rsync选项说明

    rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersyn...

网友评论

      本文标题:同步任务的插队实现笔记

      本文链接:https://www.haomeiwen.com/subject/qepspltx.html