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
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());
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:
- 1. Sandbox và NSTask
- 2. Cách cấp quyền sử dụng NSTask - mục tiêu-c
- 3. NSTask chặn chủ đề chính
- 4. thi hành lệnh shell với | (đường ống) sử dụng NSTask
- 5. NSTask NSPipe - dòng khách quan c lệnh giúp đỡ
- 6. Sử dụng NSTask và NSPipe làm cho việc sử dụng CPU 100%
- 7. Mở rộng Xcode 8 thực hiện NSTask
- 8. Lấy dữ liệu từ NSTask trong thời gian thực bằng cách sử dụng thông báo không hoạt động
- 9. Giá treo bằng Elixir
- 10. Driver.getConnection bị treo bằng cách sử dụng trình điều khiển SQLServer và Java 1.6.0_29
- 11. Nhận lệnh treo bằng cách sử dụng VS 2012 và TFS 2008 (TFS lỗi TF400307)
- 12. Đường dẫn khởi chạy NSTask không thể truy cập
- 13. NamedPipeServerStream.EndWaitForConnection() chỉ bị treo khi sử dụng
- 14. Ứng dụng bị treo và treo tất cả các chủ đề khi sử dụng AsyncTask
- 15. NSTask hoặc tương đương với iPhone
- 16. Sử dụng biểu thức máy phát điện khiến Python treo
- 17. Đầu ra thời gian thực của NSTask
- 18. Unity3d Ứng dụng bị treo khi sử dụng plugin Android
- 19. Populating $ scope bằng cách sử dụng .getJSON()
- 20. Làm thế nào để treo Win + Tab sử dụng LowLevelKeyboardHook
- 21. Cách tìm bộ nhớ được tab chrome sử dụng bằng cách sử dụng javascript
- 22. dữ liệu đọc từ fsockopen sử dụng fgets/fread treo
- 23. Ít treo ứng dụng Sinatra
- 24. Phát hiện ứng dụng treo
- 25. Chương trình đơn giản sử dụng Ống treo
- 26. bằng cách sử dụng DirectoryWalker
- 27. Kiểm tra Rspec treo bằng Paperclip
- 28. Tạo Mutex bị treo trong khi sử dụng mạo danh
- 29. Swift hashValue treo ứng dụng
- 30. Cách vẽ biểu đồ đường bằng cách sử dụng mảng Json bằng cách sử dụng webrequest
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