NSOperation

GCD:

dispatch_after: 指定多少秒之后提交到队列中

常用组合+dispatch_once


NSOperation: 包含如下几种GCD无法完成的功能

GCD和NSOperation的选择一般原则

如果GCD可以实现的逻辑,首选GCD;  GCD无法实现的功能,选NSOperation


最终需求:多个耗时任务同时执行;回到主线程更新界面

1. NSBlockOperation+非主队列

2. [[NSOperationQueue mainQueue] addOperationWithBlock:^ {//更新界面逻辑}];


GCD: Serial/Concurrent; sync/async


NSOperation如何使用?

1. 队列类型

   a. 主队列(主线程)

   b. 非主队列

2. 执行方式

   a. 调用start方法(相当于同步)

   b. 直接添加到非主队列中(相当于异步)


只有NSOperation执行功能

1. 限制最大并发数(限制同时最大执行的任务的个数)

2. 取消/暂停队列中的所有任务(取消:无法再恢复;暂停:可以重新恢复下载)

3. 设置任务之间的依赖关系(手动修改任务的执行方式)(面试点)

4. 取消队列中的某个任务(取消:无法再恢复)


NSOperation如何使用?

1. 使用NSOperation两个子类: NSInvocationOperation(几乎不使用); NSBlockOperation(常使用)

2. 一般步骤:

  a. 创建Operation操作对象(任务)

  b. 创建队列

  c. 把操作对象放到队列中执行


样例:使用NSBlockOperation创建任务,并执行(同步执行+异步执行);添加GCD无法实现的功能

  【Demo03_NSBlockOperation】


<span style="font-size:14px;">- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //手动设置任务之间依赖关系,进而改变自动的执行顺序
    [self createDependency];
}

- (void)createDependency {
    /*需求:往非主队列中添加三个任务Task1;Task2;Task3
      自动执行顺序:三个任务同时执行
      改后的执行顺序:任务三等待任务一和任务二执行完毕,才执行
      依赖关系:task3->task2; task3->task1
     */
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *firstOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"开始下载图片一...");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"下载图片一完成");
    }];
    NSBlockOperation *secondOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"开始下载图片二...");
        [NSThread sleepForTimeInterval:5];
        NSLog(@"下载图片二完成");
    }];
    NSBlockOperation *thirdOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片三");
    }];
    //设置/添加依赖关系
    /* 注意点:
       1. 千万不要造成循环依赖(死锁)
       2. 依赖关系在添加到队列之前
     */
    [thirdOperation addDependency:firstOperation];
    [thirdOperation addDependency:secondOperation];
    [queue addOperation:firstOperation];
    [queue addOperation:secondOperation];
    [queue addOperation:thirdOperation];
}

//同步执行
- (IBAction)blockSync:(id)sender {
    //1.创建操作对象
    NSBlockOperation *operation = [[NSBlockOperation alloc] init];
    //2.添加任务
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片一:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片二:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片三:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片四:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片五:%@", [NSThread currentThread]);
    }];
    //3.执行任务(同步执行任务几乎不用;没有规律)
    [operation start];
}
//异步执行 -》保证子线程执行
- (IBAction)blockAsync:(id)sender {
    //1.创建操作对象(方式二:常用; 创建和添加任务合二为一)
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片一:%@", [NSThread currentThread]);
    }];
    NSBlockOperation *anotherOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片二:%@", [NSThread currentThread]);
        //回到主线程(获取主队列)
//        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
//            //主线程执行
//            NSLog(@"回到主线程更新界面:%@", [NSThread currentThread]);
//        }];
    }];
    
    NSBlockOperation *thirdOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片三....%@",[NSThread currentThread]);
    }];
    NSBlockOperation *forthOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片四....%@", [NSThread currentThread]);
    }];
    NSBlockOperation *fifthOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片五....%@", [NSThread currentThread]);
    }];
    NSBlockOperation *sixthOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片六....%@", [NSThread currentThread]);
    }];
    
    //2.创建非主队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //2.1 设置最大同时执行的任务的个数
    queue.maxConcurrentOperationCount = 2;
    //3.操作对象放到非主队列中(自动执行)
    [queue addOperation:operation];
    [queue addOperation:anotherOperation];
    [queue addOperation:thirdOperation];
    [queue addOperation:forthOperation];
    [queue addOperation:fifthOperation];
    [queue addOperation:sixthOperation];
    
//    //如何暂停队列中的所有任务;
//    [queue setSuspended:YES];
//    //把队列中的所有暂停的任务重新启动
//    [queue setSuspended:NO];
//    //如何取消队列中的所有任务(不会恢复;从队列中移除)
//    [queue cancelAllOperations];
}
</span>

NSOperation操作对象有三个状态(了解):

1. isReady: YES(操作对象已经准备好,等待被执行);NO(可能有其它步骤没有完成)

2. isExecuting: YES(正在执行中); NO(没有执行)

3. isFinished:YES(操作执行成功/被取消cancel)


资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在机器人技术中,轨迹规划是实现机器人从一个位置平稳高效移动到另一个位置的核心环节。本资源提供了一套基于 MATLAB 的机器人轨迹规划程序,涵盖了关节空间和笛卡尔空间两种规划方式。MATLAB 是一种强大的数值计算与可视化工具,凭借其灵活易用的特点,常被用于机器人控制算法的开发与仿真。 关节空间轨迹规划主要关注机器人各关节角度的变化,生成从初始配置到目标配置的连续路径。其关键知识点包括: 关节变量:指机器人各关节的旋转角度或伸缩长度。 运动学逆解:通过数学方法从末端执行器的目标位置反推关节变量。 路径平滑:确保关节变量轨迹连续且无抖动,常用方法有 S 型曲线拟合、多项式插值等。 速度和加速度限制:考虑关节的实际物理限制,确保轨迹在允许的动态范围内。 碰撞避免:在规划过程中避免关节与其他物体发生碰撞。 笛卡尔空间轨迹规划直接处理机器人末端执行器在工作空间中的位置和姿态变化,涉及以下内容: 工作空间:机器人可到达的所有三维空间点的集合。 路径规划:在工作空间中找到一条从起点到终点的无碰撞路径。 障碍物表示:采用二维或三维网格、Voronoi 图、Octree 等数据结构表示工作空间中的障碍物。 轨迹生成:通过样条曲线、直线插值等方法生成平滑路径。 实时更新:在规划过程中实时检测并避开新出现的障碍物。 在 MATLAB 中实现上述规划方法,可以借助其内置函数和工具箱: 优化工具箱:用于解决运动学逆解和路径规划中的优化问题。 Simulink:可视化建模环境,适合构建和仿真复杂的控制系统。 ODE 求解器:如 ode45,用于求解机器人动力学方程和轨迹执行过程中的运动学问题。 在实际应用中,通常会结合关节空间和笛卡尔空间的规划方法。先在关节空间生成平滑轨迹,再通过运动学正解将关节轨迹转换为笛卡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值