2012-05-07 22 views
5

tôi đã triển khai NSOperation sau, để vẽ N quan điểm tùy chỉnhNSOperation: addSubview trong thread chính và chậm

- (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"); 
} 

trong phương pháp drawRect của customView Tôi có

- (void)drawRect { 

    <<Drawing code>> 

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

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

Vì vậy, các đại biểu nhận thông báo khi tất cả các chế độ xem được vẽ.

Vấn đề là sau khi nhật ký "Thao tác đã hoàn tất" mất khoảng 5 giây trước khi tôi có thể xem nhật ký "Đã vẽ" đầu tiên.

Tại sao điều này xảy ra? Và nói chung, tôi nên hành xử như thế nào để tìm ra dòng mã nào đang mất quá nhiều thời gian để thực hiện?

------ EDIT ------

Đôi khi (như 1 trong số 10 lần) tôi đã nhận được tai nạn làm điều này, bởi vì tôi không nên gọi addsubview từ NSOperation, kể từ nó không có chủ đề an toàn. Vì vậy, tôi đã thay đổi thành

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

Bây giờ tôi không gặp sự cố nữa, nhưng quá trình này mất rất nhiều thời gian để thực thi! Giống như 5 lần so với trước đây.

Tại sao quá chậm?

Trả lời

5

Để làm cho mọi hoạt động bình thường chúng ta cần phải quên đi NSOperation và sử dụng "lừa"

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

    [self createCustomViews]; 

    dispatch_async(main_queue, ^{ 

     [self addAnotherCustomViewToView]; 

    }); 
}); 
+0

Hi! Câu hỏi dành cho bạn: Tại sao dispatch_async lồng nhau lại cần thiết? (Tôi tin tưởng rằng bạn đã viết nó theo cách đó vì một lý do. Tôi chỉ không nhìn thấy nó được nêu ra.) Cảm ơn! –

+0

Thành thật mà nói tôi tìm thấy mã này xung quanh, và nó chỉ hoạt động. Tôi không thực sự biết nhiều hơn thế này :-) – Abramodj

+0

OK! (Bây giờ tôi đang làm nhiệm vụ - hehe.) Cảm ơn bạn đã đăng nó. :) –

Các vấn đề liên quan