2015-10-29 14 views
7

Tôi cần phải sử dụng NSTask đồng bộ, tuy nhiên tôi thấy rằng đôi khi tác vụ của tôi bị treo trong lệnh 'waitUntilExit'. Tôi tự hỏi nếu có một cách duyên dáng - một phương pháp xử lý lỗi - để chấm dứt tác vụ treo để tôi có thể khởi động lại một tác vụ khác?Treo NSTask bằng cách sử dụng waitUntilExit

Trả lời

1

Bạn có thể khởi chạy tác vụ bằng cách sử dụng -[task launch] và sau đó thăm dò định kỳ trên thuộc tính isRunning của nó để kiểm tra xem nó đã kết thúc chưa. Nếu nó không hoàn thành sau một khoảng thời gian nhất định, bạn có thể gọi -[task terminate] để chấm dứt nó. Điều này yêu cầu nhiệm vụ bạn bắt đầu không bỏ qua tín hiệu SIGTERM.

Nếu tuy nhiên bỏ phiếu cho việc chấm dứt tác vụ quá kém hiệu quả trong trường hợp của bạn, bạn có thể thiết lập nguồn công văn loại DISPATCH_SOURCE_TYPE_PROC sau khi bạn đã khởi chạy tác vụ của mình. Nguồn tin này sau đó không đồng bộ gọi khối sự kiện của mình khi nhiệm vụ kết thúc:

dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, task.processIdentifier, DISPATCH_PROC_EXIT, dispatch_get_main_queue()); 
12

Lưu ý rằng nếu nhiệm vụ được chạy qua NSTask lấp đầy ống đầu ra thì quá trình này sẽ treo, ngăn chặn có hiệu quả waitUntilExit từ trở về.

Bạn có thể ngăn tình trạng này bằng cách gọi

[task.standardOutput.fileHandleForReading readDataToEndOfFile]; 

trước khi gọi

[task waitUntilExit]; 

Điều này sẽ làm cho dữ liệu đường ống đầu ra để được đọc cho đến khi quá trình văn bản cho ống đầu ra đóng cửa nó.

Ví dụ mã chứng tỏ vấn đề và giải pháp khác nhau:

https://github.com/lroathe/PipeTest

+1

Awesome! Cảm ơn bạn đã chỉ ra điều đó - đã tiết kiệm cho tôi rất nhiều thời gian chờ đợi một ống treo .. – Jay

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