2012-03-30 12 views
5

Tôi muốn tạo ra một sợi công nhân đó không phải là chủ đề chính vì vậy tôi có thể gọi ...Làm thế nào để tạo ra một NSThread đó không phải là chủ đề chính mà không thực hiện một chọn ngay

[self performSelector:@selector(doStuff) OnThread:self.myWorkerThread withObject:nil]; 

. .. trong một loạt các vị trí trong mã của tôi. Làm thế nào để tạo một chủ đề .. bất kỳ chủ đề và gán nó vào một biến vì vậy tôi có thể sử dụng nó hơn và hơn trong mã của tôi. NSThread detachNewThreadWithSElector sẽ chỉ tạo một cái cho mục đích chạy một bộ chọn đó. Tôi cần phải tạo một chủ đề và sử dụng nó bằng cách nào đó.

Tôi đang sử dụng iOS và cần phải thực hiện tất cả các bản ghi CoreData của mình trên một writerThread. Tôi cần phải sử dụng cùng một thread (đó không phải là chính) mỗi lần.

Trả lời

4

Tôi đặc biệt khuyên bạn nên tìm trong Grand Central Dispatch thay thế :). Bạn có thể dễ dàng tạo một hàng đợi công văn thông qua dispatch_queue_create hoặc nhận một trong các chủ đề đồng thời hiện có và gửi bất kỳ thứ gì bạn muốn. Nó sẽ tạo ra số lượng thích hợp của đề dựa trên tình trạng khối lượng công việc/OS, vv Nó sẽ giống như thế này:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 
    //Do stuff 
}); 

Hoặc bạn có thể nhìn vào đối tác NS của nó, NSOperation. Tôi không biết cách nào để làm điều này chỉ với NSThread. Có vẻ như cách duy nhất để thiết lập bộ chọn của nó là khởi động nó với một.

EDIT Nếu bạn muốn chỉ là một chủ đề, chỉ cần gọi [[NSThread alloc] init]: p

THÊM EDIT: iPhone: how to use performSelector:onThread:withObject:waitUntilDone: method?

Như mỗi câu trả lời này, nó sẽ là khó khăn để thiết lập, như tất cả các chủ đề cần một chức năng "chính" tại thời điểm nó được tạo ra hoặc người nào khác nó sẽ không làm gì ...

+0

cảm ơn vì điều này .. Tôi đã cập nhật câu hỏi của mình với nhiều chi tiết hơn. –

+0

Tôi đã cập nhật câu trả lời – borrrden

+0

nếu tôi performSelectorWithThread: [NSThread mainThread] nó hoạt động tốt nhưng performSelectorWithThread: [[NSThread alloc] init] đóng băng và không làm bất cứ điều gì :(.. Tôi đã thử gọi 'start' sau khi phân bổ nó nhưng –

2

Có vẻ như cách dễ nhất là sử dụng khối s:

void (^now)(void) =^{ 
    NSDate *date = [NSDate date]; 
    NSLog(@"The date and time is %@", date); 
}; 

và gọi:

now(); 

NSBlockOperation hoặc dispatch_async().

Xem thêm ở đây: http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

+0

Tôi đang sử dụng iOS ... không phải là máy mac? –

+1

Không có khối nào được sử dụng trên iOS. Bạn đang sử dụng SDK nào? Chúng được hỗ trợ trong 4 và 5. –

1

Nếu bạn đang đặc biệt làm điều này để tương tác với Core Data (như câu hỏi của bạn gợi ý), và bạn có thể yêu cầu iOS 5 cho ứng dụng của bạn, bạn có thể muốn điều tra hàng đợi tin mới bối cảnh đối tượng được quản lý được thêm vào trong iOS 5. Nó tạo và quản lý hàng đợi thread/dispatch cho bạn, và bạn gửi các khối đó để chạy trên hàng đợi như một cách tương tác với nó. Xem the release notesWWDC session video để biết thêm chi tiết.

Cập nhật (tháng 5 năm 2016): API mới được thêm trong iOS 5 là -[NSManagedObjectContext initWithConcurrencyType:]. Kể từ iOS 9, bộ khởi tạo cũ hơn đã không được chấp nhận, cùng với loại đồng thời giam giữ đã được mặc định trước khi giới thiệu các loại đồng thời dựa trên hàng đợi. Vì vậy, nếu bạn không sử dụng hàng đợi để quản lý truy cập ngữ cảnh, tôi khuyên bạn nên di chuyển theo hướng đó.

Tôi cũng khuyên bạn nên mạnh mẽ using the com.apple.CoreData.ConcurrencyDebug launch argument khi bạn đang phát triển để giúp bạn nắm bắt những nơi bạn đang vi phạm quy tắc.

+0

Rất thú vị - thankyou –

+0

Liên kết đã chết - đây là lý do tại sao bạn nên bao gồm một số nội dung từ liên kết trong câu trả lời của bạn –

2

Nếu bạn thực sự muốn điều này và không sử dụng GCD, sau đó:

NSThread *thr = [[NSThread alloc] initWithTarget:anobject selector:@selector(doStuff) object:nil]; 

Và điều này sẽ gọi phương thức thích hợp trên đối tượng của bạn bất cứ khi nào bạn muốn - Tuy nhiên, có vẻ như với tôi rằng việc thực hiện hiện tại của NSThread doesn không cho phép thay đổi mục tiêu và bộ chọn.

+0

Thats ngược lại những gì tôi muốn.Định kỳ tôi ghi vào dữ liệu cốt lõi và tôi muốn làm này trên một thread được chỉ định (khi khởi động) vì vậy tôi không cần phải có nhiều NSManagedObjectContexts vì vậy tôi cần phải thực hiệnSelectOnThread:

+0

bị thiếu: \t [thr start]; :) – ingconti

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