5

我已经实现了以下 NSOperation 来绘制N自定义视图

- (void)main {

    for (int i=0; i<N; i++) {

       << Alloc and configure customView #i >>
       //(customView is a UIView with some drawing code in drawrect)

       [delegate.view addSubview:customView];

    }

    NSLog(@"Operation completed");
}

在我有的 customView 的 drawRect 方法中

- (void)drawRect {

    <<Drawing code>>

    NSLog(@"Drawed");
    delegate.drawedViews++;

    if (delegate.drawedViews==VIEWS_NUMBER) {
        [delegate allViewsDrawn];
    }
}

因此,当绘制所有视图时,委托会收到通知。

问题是在“操作完成”日志之后,我需要大约 5 秒才能看到第一个“绘制”日志。

为什么会这样?一般来说,我应该如何表现才能找出哪一行代码正在执行这么多时间?

- - - 编辑 - - -

有时(例如十分之 1)我这样做时会崩溃,因为我不应该addsubview从 NSOperation 调用,因为它不是线程安全的。所以我把它改成:

[delegate.view  performSelectorOnMainThread:@selector(addSubview:) withObject:customView waitUntilDone:NO];

现在我没有崩溃了,但是这个过程需要很长时间才能执行!比以前多了5倍。

为什么这么慢?

4

1 回答 1

5

为了让事情正常工作,我们需要忘记 NSOperation 并使用这个“技巧”

dispatch_queue_t main_queue = dispatch_get_main_queue();
dispatch_async(main_queue, ^{

    [self createCustomViews];

    dispatch_async(main_queue, ^{

        [self addAnotherCustomViewToView];

    });
});
于 2012-05-24T12:30:40.060 回答