2009-07-17 28 views
10

Tôi khá mới đối với Objective-C và tôi không thể tìm ra cách chờ đợi theo cách không chặn. Tôi có một đối tượng đang được phổ biến không đồng bộ và tôi cần phải đợi nó trước khi tôi có thể tiếp tục theo một phương pháp khác. Ngay bây giờ tôi đang sử dụng chức năng ngủ, nhưng điều này chặn toàn bộ ứng dụng và myObject không bao giờ được tải.Chức năng chờ không chặn trong Mục tiêu-C

while (!myObject) 
{ 
    sleep(1); 
} 
return myObject; 

EDIT: Đoạn mã này có thể được gọi trước khi myObject được tải. Trong trường hợp này, tôi thực sự muốn chặn trong phương thức này, nhưng mã của tôi chặn tất cả mọi thứ kể cả myObject đang được nạp.

+0

Nhờ câu trả lời của Chuck, tôi thấy câu hỏi này và thực hiện nó bằng cách sử đoạn mã thứ hai của mình: http: //stackoverflow.com/questions/149646/best-way-to-make-nsrunloop-wait-for-a-flag-to-be-set –

Trả lời

6

Nếu có thể, hãy cho lớp học phương thức myObjectLoaded: được gọi khi đối tượng được đề cập được tải. Nếu không, tương đương thành ngữ nhất của những gì bạn đã viết ở trên là tạo bộ đếm thời gian để kiểm tra myObject và thực hiện điều gì đó một khi nó tìm thấy nó.

Nếu bạn thực sự cần thiết để làm điều đó ở giữa một phương pháp vì lý do nào đó, bạn sẽ phải tạo một vòng lặp liên tục chạy runloop. Đó là việc thiếu một runloop khiến ứng dụng của bạn chặn.

0

Có vẻ như bạn đang tìm kiếm mẫu người quan sát. Apple gọi nó là "notification".

+0

Không thực sự những gì tôi đang tìm kiếm. Tôi không muốn được thông báo, tôi muốn * this * thread bị chặn cho đến khi myObject được tải, nhưng mã của tôi chặn myObject không bị tải. –

0

Đó là bởi vì bạn đang dừng thread chính chờ đợi cho đối tượng của bạn được nạp. Đừng làm điều đó, bởi vì chủ đề chính là luồng điều khiển giao diện người dùng và đợi đầu vào của người dùng. Nếu bạn chặn luồng chính, bạn chặn giao diện người dùng ứng dụng.

Nếu bạn muốn các chủ đề chính để làm điều gì đó khi đối tượng được nạp, sau đó tạo ra một phương pháp myObjectLoaded: và gọi từ đề tải của bạn:

[myObjectController performSelectorOnMainThread:@selector(myObjectLoaded:) 
            withObject:myObject 
            waitUntilDone:NO]; 

nơi myObjectController thể được bất kỳ đối tượng thậm chí MyObject riêng của mình.

3

NSNotification nên giải quyết vấn đề.

http://developer.apple.com/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

Thay vì chờ đợi trên về đối tượng, có đối tượng đăng ký này cho các thông báo đến từ đối tượng khác của bạn (nói Publisher) mà populates dữ liệu không đồng bộ. Một đối tượng nhà xuất bản này kết thúc, có nó đăng một NSNotification, mà sau đó sẽ được tự động chọn bởi đối tượng chờ đợi của bạn. Điều này sẽ loại bỏ chờ đợi quá.

7

đào nhỏ này làm việc cho tôi (trong trật tự để trì hoãn trong 20 giây) ....

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false); 
Các vấn đề liên quan