【问题标题】:NSOperationQueue takes forever to add subviewNSOperationQueue 需要永远添加子视图
【发布时间】:2015-06-29 12:19:03
【问题描述】:

我正在后台队列中绘制一个复杂视图,然后将其作为子视图添加到我的集合视图的内容视图中,但这样做需要很长时间。

这是我的代码:

[self.drawingOperationQue addOperationWithBlock:^{

    ObservationViewSmall *observationSmall = [[ObservationViewSmall alloc] initWithFrame:CGRectMake(0, 0, 408, 332)];
    [observationSmall initViewWithObservation:[self.childObservationArray objectAtIndex:indexPath.row]];
    cell.userInteractionEnabled = YES;

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [cell.contentView addSubview:observationSmall];

    }];

}];

我们非常欢迎任何帮助。

【问题讨论】:

  • 请注意,大部分 UIKit 元素都不是线程安全的。似乎您正在后台队列中创建 UIView 子类,但我认为您做不到。当然,您可以使用图形上下文在后台线程上绘制。

标签: ios uikit nsoperationqueue


【解决方案1】:

参考这个答案:https://stackoverflow.com/a/11123184/190599

您正在从主线程创建视图。

以下将在主线程上创建您的视图:

[self.drawingOperationQue addOperationWithBlock:^{

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        ObservationViewSmall *observationSmall = [[ObservationViewSmall alloc] initWithFrame:CGRectMake(0, 0, 408, 332)];
        [observationSmall initViewWithObservation:[self.childObservationArray objectAtIndex:indexPath.row]];
        cell.userInteractionEnabled = YES;
        [cell.contentView addSubview:observationSmall];
    }];

}];

【讨论】:

  • 这不是整个想法吗?在backgorund中创建您的视图(绘制它们)然后将它们添加到主线程中?我也尝试过,但它阻止了用户界面。集合视图的滚动变得抖动
  • @JunaidAhmed 视图的初始化并将其添加为子视图应该发生在主视图上,您​​在 ObservationViewSmall 上完成的两个初始化调用中所做的额外工作需要分开主线程。
  • @CodeReaper,你为什么在 addOperationWithBlock 中使用 addOperationWithBlock ?这在这种情况下没有意义
  • @Doro 因为我不知道Junaid 在drawingOperationQueue 中还有什么其他操作。添加到 drawingOperationQueue 内的主队列可保持当前行为。另一方面,如果只添加了这些块来初始化 ObservationViewSmalls,那么你还不如直接使用主队列。
  • 伙计们,我重写了我的视图的 drawRect 函数来绘制我的自定义绘图。绘制完成后,想法是将绘制的视图添加到主线程中单元格的内容视图中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2013-12-08
  • 1970-01-01
  • 2021-03-17
  • 2014-02-24
  • 2014-07-08
相关资源
最近更新 更多