2011-01-21 30 views
7

Mục tiêu là "khởi chạy đồ họa spinner khi bắt đầu xemWillAppear tải dữ liệu trước khi hiển thị chế độ xem bảng" để người dùng không tự hỏi tại sao có sự chậm trễ trước khi xem bảng. I E. một UIActivityIndicatorView đã được thêm vào cửa sổ, và tôi chỉ muốn thiết lập alpha để ẩn/hiện nó.Sự cố - "Bộ sưu tập <CALayerArray: 0x645dfc0> đã bị đột biến khi được liệt kê".

Tôi gặp lỗi lạ này khi bắt đầu một chuỗi để đảm bảo rằng số lần xem "quay bánh răng" (tag = 333) được hiển thị, trước khi chuyển sang tải/tính toán nội dung trong viewWillAppear.

Tôi không nhận được nó trên mọi cuộc gọi tới [appdel addGearz] và [appdel removeGearz], điều này xảy ra cho cả hai trường hợp này và ngẫu nhiên. Nó có thể xảy ra sau 2 viewWillAppears, hoặc sau 15. Nếu tôi nhận xét ra dòng đặt alpha, mọi thứ đều hoạt động.

Một viewWillAppear điển hình trông giống như thế này,

[super viewWillappear]; 
[email protected]"Products listing"; //and other simple things 
[appdel addGearz]; 
[self getProducts]; 
[self getThumbnails]; 
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed 

Và đây là đoạn code mà bị treo nếu dòng với .alpha không nhận xét ra

-(void)addGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil]; 
} 

-(void)removeGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil]; 
} 

- (void)gearzOn { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=1.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

- (void) gearzOff { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=0.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

Tôi đã sử dụng của người khác đang , vì vậy ... bất cứ điều gì hiển nhiên bạn có thể thấy? Chắc chắn tôi phải có khả năng thay đổi alpha của UIViews trong một chủ đề? Tôi có cần phải "nhúng" thay đổi alpha trong một số "dừng liệt kê trong khi tôi thay đổi" mã này không?

Tôi đã làm cho nó không bị hỏng bằng cách di chuyển đường alpha-thay đổi đó lên trên hồ bơi phân bổ hoặc dưới [cống thoát nước], nhưng sau đó tôi nhận được rất nhiều "autoreleased with no pool in - just leaking" -messages .

Rõ ràng, có điều tôi không hiểu về mã chuỗi này.

Trả lời

8

Bạn không được cố sửa đổi giao diện người dùng trên một chuỗi riêng biệt. Giao diện người dùng chỉ nên được thao tác trên chuỗi chính.

Thay vì tách chuỗi mới, bạn nên sử dụng performSelectorOnMainThread:withObject:waitUntilDone:. Điều này sẽ đảm bảo rằng phương thức sẽ được gọi trên luồng thích hợp.

+0

[self performSelectorOnMainThread: @selector (gearzOn) withObject: nil waitUntilDone: YES]; không cập nhật khả năng hiển thị ngay lập tức, đó là toàn bộ ý tưởng - vì viewWillAppear sẽ thực hiện tất cả tải của nó trước khi chế độ xem được đẩy, người dùng nên biết rằng có điều gì đó đang xảy ra. –

+0

Không xuất hiện với [window setNeedsDisplay]; hoặc. Tuy nhiên, việc sử dụng một UIAnimation alpha đã làm việc. (Nhanh phai.) Bất kỳ ý tưởng nào tại sao lại hoạt động nhưng không đặt alpha và yêu cầu cửa sổ cập nhật? Sẽ đánh dấu câu trả lời của bạn là chính xác, nó giải quyết được vấn đề. Cảm ơn! –

+0

Tôi đoán nó có quan hệ với hàng đợi hiển thị của lớp và cách hoạt ảnh được xử lý. Tốt để biết rằng UIAnimation đã làm các trick. –

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