2010-11-19 25 views
42

Mã của tôi cần đảm bảo hoạt động nhất định chạy trên luồng chính, nhưng cuộc gọi có thể đến từ chủ đề nền.Cách thích hợp để phát hiện xem mã có đang chạy trên luồng chính trong Objective-C không? (iOS)

Để phát hiện các tình huống trong nền Tôi đã sử dụng như sau:

- (void)selectorToRunInMainThread:(id)arguments 
{ 
    // push to main thread 
     if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop]) 
     { 
      [self performSelectorOnMainThread:@selector(selectorToRunInMainThread:) withObject:arguments waitUntilDone:NO]; 
      return; 
     } 

    /* 
    ... function content ... 
    */ 
} 

này hoạt động trên iOS 4 và iOS 3.2 nhưng không phải trên iOS 3.1.3 trở về trước. Trong các phiên bản trước đó, hàm sẽ tiếp tục được gọi trong vòng lặp vô tận.

Thay đổi so với:

if (![[NSRunLoop currentRunLoop] isEqualTo:[NSRunLoop mainRunLoop]])

không có tác dụng, họ vẫn không bao giờ so sánh với các giá trị như nhau.

Tôi đã tìm thấy giải pháp có vẻ hoạt động nhưng tôi muốn xem những gì người khác đề xuất trước tiên.

Trả lời

89

[NSThread isMainThread] và nếu không, hãy gửi qua bất kỳ một số cơ chế nào đến chuỗi chính (những gì bạn có là tốt).

+0

Đó là rất nhiều sạch hơn để đọc hơn những gì tôi đã có: if ([[NSRunLoop currentRunLoop] getCFRunLoop]! = [[NSRunLoop mainRunLoop] getCFRunLoop]) –

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