Lưu ý: Có thể cuộn xuống để đọc bản chỉnh sửa của tôi.Đặt một NSTimer vào một chủ đề riêng biệt
Tôi đang cố gắng thiết lập một NSTimer trong một chuỗi riêng biệt để nó tiếp tục kích hoạt khi người dùng tương tác với giao diện người dùng của ứng dụng của tôi. Điều này dường như hoạt động, nhưng Rò rỉ báo cáo một số vấn đề - và tôi tin rằng tôi đã thu hẹp nó xuống mã bộ đếm thời gian của tôi.
Hiện tại điều đang xảy ra là updateTimer cố gắng truy cập vào NSArrayController (timersController) được liên kết với một NSTableView trong giao diện ứng dụng của tôi. Từ đó, tôi lấy hàng được chọn đầu tiên và thay đổi cột timeSpent của nó. Lưu ý: nội dung của timersController là một tập hợp các đối tượng được quản lý được tạo thông qua Core Data.
Từ đọc xung quanh, tôi tin rằng những gì tôi nên cố gắng làm là thực hiện chức năng updateTimer trên chủ đề chính, chứ không phải trong chủ đề thứ cấp của bộ tính giờ của tôi.
Tôi đăng bài ở đây với hy vọng rằng ai đó có nhiều kinh nghiệm hơn có thể cho tôi biết nếu đó là điều duy nhất tôi làm sai. Sau khi đọc tài liệu của Apple về Threading, tôi đã tìm thấy nó là một lĩnh vực chủ đề lớn.
NSThread *timerThread = [[[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil] autorelease];
[timerThread start];
-(void)startTimerThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
activeTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES] retain];
[runLoop run];
[pool release];
}
-(void)updateTimer:(NSTimer *)timer
{
NSArray *selectedTimers = [timersController selectedObjects];
id selectedTimer = [selectedTimers objectAtIndex:0];
NSNumber *currentTimeSpent = [selectedTimer timeSpent];
[selectedTimer setValue:[NSNumber numberWithInt:[currentTimeSpent intValue]+1] forKey:@"timeSpent"];
}
-(void)stopTimer
{
[activeTimer invalidate];
[activeTimer release];
}
CẬP NHẬT
tôi vẫn hoàn toàn mất liên quan đến rò rỉ này. Tôi biết tôi rõ ràng đang làm điều gì đó sai trái, nhưng tôi đã rút đơn của tôi xuống phần xương trần của nó và vẫn không thể tìm thấy nó. Vì mục đích đơn giản, tôi đã tải mã bộ điều khiển ứng dụng của mình lên: a small pastebin. Lưu ý rằng bây giờ tôi đã xóa mã chuỗi bộ hẹn giờ và thay vào đó đã chọn chạy bộ hẹn giờ trong một runloop riêng biệt (như được đề xuất ở đây).
Nếu tôi đặt Rò rỉ Gọi Tree để ẩn cả hai biểu tượng Thiếu và Thư viện System, Tôi nhìn thấy đầu ra sau đây:
EDIT: Liên kết đến ảnh chụp màn hình bị phá vỡ và do loại bỏ.
Tại sao bạn thiết lập một vòng lặp chạy bổ sung? Bộ hẹn giờ của bạn có thể hoạt động bình thường với vòng lặp chạy chính. – zneak
Liên kết ghi đè đã chết. –