美文网首页IOSiOS DeveloperiOS学习笔记
多线程中不同线程同时操作一个数组

多线程中不同线程同时操作一个数组

作者: flightlessBirdT | 来源:发表于2016-10-21 09:47 被阅读660次

之前在调试跨层传值的问题时发现一个很奇怪的问题:请求数据完成后的block会回调两次。苦思冥想了好久都没有理解为什么。C控制器中block回调中的代理方法会调用B控制器中的代理方法,B控制器中的代理方法会调用A控制器中的代理方法。

这是在C控制器

   [XJHttpTool PUT:url dictParameters:params success:^(id responseObject) {
        if ([[responseObject objectForKey:@"success"] integerValue]==1) {
            NSDictionary *dic = [responseObject objectForKey:@"kanban"];
            BoardModel *boardModle =[BoardModel objectWithKeyValues:dic];
            if ([self.delegate respondsToSelector:@selector(didChangeBoardInfo:andChangedStar:)]) {
                [self.delegate didChangeBoardInfo:boardModle andChangedStar:self.changedStar];
            }
        }else{
            [self alertUserWrongInfo:@"保存失败!"];
        }
    } failure:^(NSError *error) {
        [self alertUserWrongInfo:@"保存失败!"];
    }];

直到今天早上再次调试的时候,发现控制台输出了这个信息:

      'NSGenericException', reason: '*** Collection <__NSArrayM: 0x8ef350> was mutated while being enumerated.')

然后我就明白了。这个错误的意思是如果对数组枚举的时候不能同时对其进行元素的删除操作。

这是在上文block回调后A控制器中调用的代理方法

   for (NSArray *arr in self.boardArrayM) {
    if (arr.count == 0) {
        [self.boardArrayM removeObject:arr];
     }
   }

解决方法1:定义一个一模一样的数组,遍历数组A然后操作数组B。

    NSMutableArray *arrM = [NSMutableArray arrayWithArray:self.boardArrayM];
     for (NSArray *arr in arrM) {
      if (arr.count == 0) {
         [self.boardArrayM removeObject:arr];
      }
    }

解决方法2:使用for(;;)循环。而不是for in枚举遍历。

解决了这个问题后,我发现block的回调正常了,只调用一次。虽然我不明白为什么多个线程操作同一个数组引起问题与这个有什么联系(是线程调度紊乱?),但问题确实是解决了。如果有明白的希望能留言告诉我,谢谢!

而且dealloc测试后发现没有修改前,页面跳转到B控制器中时,C控制器是没有销毁的,页面跳转到A控制器时,C控制器也没有销毁,所以C中的方法可以再次被线程调用(怎么就调用了?不懂,有大牛请指点!),按理说导航控制器的子控制器出栈时应当销毁的,而在做了修改后,页面跳转到B控制器时,C控制器是销毁的,这个是正常的,销毁了当然方法就不可能会被再次调用了。

相关文章

  • 多线程

    多线程 多线程:一个进程中开辟多条线程,同时完成不同的任务,就是多线程。 创建方式:pthread:POSIX线程...

  • 多线程中不同线程同时操作一个数组

    之前在调试跨层传值的问题时发现一个很奇怪的问题:请求数据完成后的block会回调两次。苦思冥想了好久都没有理解为什...

  • iOS多线程开发-线程安全

    说到多线程就不得不提多线程中的锁机制,多线程操作过程中往往多个线程是并发执行的,同一个资源可能被多个线程同时访问,...

  • Java基础知识02- 线程

    多线程通信 :什么是多线程通信 ?怎么进行通信 ? 多线程通信就是多个线程同时操作同一个全局变量,但是操作的动作不...

  • C++多线程操作矩阵相乘

    由一维数组模拟二维数组的方式进行矩阵相乘操作单线程操作: 多线程操作:

  • 分布式锁

    1、锁: 单进程的系统中,存在多线程同时操作一个公共变量,此时需要加锁对变量进行同步操作,保证多线程的操作线性执行...

  • 六、linux多线程操作

    pthread线程库线程操作,包括线程的创建,线程的设置,线程同步,线程取消等操作。程序中多线程操作多适用于同时执...

  • Java中的多线程

    1 什么是多线程 在一个进程中,同时运行多个线程,用来完成不同的工作,则称为多线程。注意: 很多多线程都是模拟出来...

  • 问题:什么是多线程

    多线程 1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务多线程技术可以提高程序的执行效率 多线程...

  • 多线程(三)——多线程之间通讯

    什么是多线程之间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 多线程之间通讯需求:...

网友评论

    本文标题:多线程中不同线程同时操作一个数组

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