2012-11-13 29 views
6

Tôi rất mới với Xcode và Objective-C, vì vậy tôi thực sự không biết mình đang làm gì! ;-)
Về cơ bản tôi muốn có một Ứng dụng IPhone có thể chạy có thể hai luồng, sau này sẽ sử dụng UDP Sockets để giao tiếp với các Ứng dụng khác.Tạo hai chủ đề trong Mục tiêu-C

Tôi đã đặt chức năng phản ứng khi nút start-Thread/stop-Thread trong giao diện người dùng được nhấn, bây giờ tôi muốn lấp đầy chúng bằng mã để thực sự tạo và bắt đầu chuỗi.

  • Quy trình chính xác ở đây là gì?
  • Tôi có cần phải phân loại NSThread không?
  • Tôi nên triển khai mã ở đâu, các chuỗi mới sẽ thực thi?

    Tôi không thể thấy phương thức chạy hoặc tương tự. Tôi cho rằng có điều gì đó liên quan đến selector, điều mà tôi không hiểu.

+0

Đọc [Hướng dẫn lập trình luồng] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html) và [Tham chiếu NSThread] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html). Nếu bạn phân lớp 'NSThread', bạn thường sẽ ghi đè phương thức' main'. – omz

+5

Tôi khuyên bạn nên sử dụng [hàng đợi công văn] (http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102 -SW24). – Kevin

+0

Tôi thứ hai gửi hàng đợi. – Wevah

Trả lời

14

Sử dụng dispatch queues. Chúng chủ yếu là các chủ đề nhẹ mà bạn không cần phải lo lắng về luồng hoặc xếp hàng trực tiếp.

-(void) spawn 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [self doWorkInBackground]; 
    }); 
} 

Bạn có thể sử dụng một trong các hàng đợi tích hợp hoặc của riêng bạn.

Và có lẽ bạn cũng nên đọc trên blocks, đặc biệt là khía cạnh quản lý bộ nhớ.

+0

hi cảm ơn vì câu trả lời, tôi bắt đầu đọc hướng dẫn. Tuy nhiên, theo như tôi hiểu bây giờ, chúng tôi có thể có hàng đợi nối tiếp hoặc đồng thời. Trong các chuỗi nối tiếp, chỉ có một tác vụ được thực hiện bất kỳ lúc nào, điều này không đủ cho tôi, vì có thể có hai tác vụ đồng thời. Vì vậy, tôi sẽ cần một hàng đợi đồng thời, tuy nhiên hệ thống quản lý có bao nhiêu nhiệm vụ chạy song song. Tuy nhiên tôi cần phải chạy chính xác hai nhiệm vụ, khi người dùng yêu cầu chúng. Nói chung tuy nhiên tôi sẽ cần phải tạo ra 2 khối hoặc chức năng mỗi thực hiện một "thread" và đặt chúng trong một hàng đợi? – user1809923

+0

Vì khối được viết nội tuyến với phần còn lại của mã, và tôi sẽ cần phải có một khối cho mỗi chủ đề và các chủ đề không phải là ngắn, tôi tự hỏi nếu đó là thực sự đúng cách để đi, xem xét mã tổng quan. – user1809923

+0

Bạn có thể khai báo các khối ngoài dòng chỉ phạt –

1
- (void)performBlockInBackground:(void (^)())block { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     block(); 
    }); 
} 

Sau đó, bạn gọi nó là như thế này:

[self performBlockInBackground:^{ 
    NSLog(@"Log from background"); 
}]; 
+0

Phương thức đó sẽ sụp đổ nếu bạn không kiểm tra xem khối đó có phải là NULL không. – danielbeard

+0

@danielbeard Có tất nhiên, nhưng tại sao bạn lại gọi '[self performBlockInBackground: NULL];'? – NSAddict

+0

Nếu khối được lưu trữ trên một đối tượng khác và nó được deallocated, khối sẽ là NULL. Ví dụ. 'someObject.actionBlock' – danielbeard

1

Bạn cũng có thể xem xét sử dụng NSOperation. Nó sử dụng hàng đợi công văn dưới mui xe, nhưng cung cấp API cấp cao hơn và khả năng hủy bỏ hoạt động liên tục (có thể hữu ích cho bạn).

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