Ứng dụng của tôi tải xuống một số tài nguyên từ máy chủ, dữ liệu và mô tả dữ liệu. Các lượt tải xuống này, được kích hoạt bởi hành động của người dùng, có thể được thực hiện đồng thời, giả sử, tối đa 50 lượt tải xuống cùng một lúc. Tất cả các tác vụ không đồng bộ này sẽ kết thúc việc tạo các đối tượng trong bộ nhớ, (ví dụ: thêm lá vào cấu trúc dữ liệu, chẳng hạn như thêm khóa vào từ điển có thể thay đổi hoặc đối tượng vào mảng). Câu hỏi của tôi là: điều này có thể gây ra vấn đề ổn định không? Ví dụ, nếu một số nhiệm vụ đồng thời cố gắng thêm các khóa vào cùng một từ điển, tôi có phải xử lý tình huống, đặt một số loại khóa không? Nếu tôi thực hiện một chu trình tìm kiếm các phần tử đồ họa trong một mảng, có thể các tác vụ đang chạy khác có thể thay đổi nội dung mảng 'trong' chu trình không? Bất kỳ tài liệu tham khảo hoặc chính, định hướng chung về đa nhiệm này, các vấn đề đa luồng khác với tài liệu chính thức?iOS - Truy cập đồng thời vào tài nguyên bộ nhớ
Trả lời
Phụ thuộc vào cách bạn đang xử lý các bản tải xuống - nếu bạn đang sử dụng NSURLConnection, nó xử lý luồng/đồng thời riêng biệt cho bạn và mã của bạn là reentrant, do đó bạn không phải lo lắng về hành động đồng thời. Nếu bạn đang tạo chủ đề của riêng mình, bạn có thể gặp sự cố.
EDIT: Mã của bạn chạy trong một chuỗi chính (vòng lặp chạy chính), giả sử bạn có một NSURLConnection đang chạy sau đó nó sẽ chạy trong một chuỗi riêng biệt. Tuy nhiên mã đại biểu của bạn mà đề với các sự kiện xảy ra trong khi kết nối đang được tiến hành chạy trong vòng lặp chạy của bạn, không phải trong chủ đề khác. Điều này có nghĩa là mã của bạn chỉ có thể thực thi một thứ tại một thời điểm. Phương thức kết nối thành công sẽ không được gọi là cùng một lúc như bất kỳ mã nào khác của bạn. Nếu bạn đã chạy vòng lặp for thì nó sẽ chặn luồng chính của bạn cho đến khi nó kết thúc vòng lặp, trong khi đó kết nối kết thúc trong khi vòng lặp for vẫn chạy thì mã ủy nhiệm của bạn sẽ không thực hiện cho đến khi vòng lặp kết thúc.
Bạn có thể muốn xem xét các khối rào cản của Grand Central Dispatch (GCD). Các khối rào cản sẽ cho phép bạn làm những gì mà bạn muốn trong nền và các tài nguyên "khóa".
Xem tài liệu Apple và bài đăng trên blog của Mike Ash here trên GCD.
Ý chính cơ bản là bạn sử dụng hàng đợi đồng thời mà bạn tạo để thực hiện đọc và sử dụng khối ngăn chặn để chặn tất cả quyền truy cập vào tài nguyên đó để ghi. đồ tốt.
Chúc may mắn
Tim
- 1. Truy cập nguyên tử vào bộ nhớ dùng chung
- 2. truy cập biến đồng thời trong c
- 3. đồng thời truy cập file
- 4. Tê giác và truy cập đồng thời vào javax.script.ScriptEngine
- 5. File.WriteAllText và truy cập đồng thời
- 6. AFOAuth2Không thể truy cập tài nguyên
- 7. Qt cách truy cập tài nguyên
- 8. Bộ nhớ ngoài truy cập Android
- 9. Truy cập tệp PHP và đồng thời
- 10. Truy cập đồng thời trong SQLite
- 11. truy cập bộ nhớ so với bản sao bộ nhớ
- 12. Tài nguyên bộ điều hợp đồng bộ hóa Android
- 13. Cách truy cập maven.build.timestamp để lọc tài nguyên
- 14. Đồng thời, 4 Ứng dụng CUDA cạnh tranh để nhận tài nguyên GPU
- 15. Truy cập bộ nhớ nhanh trong C++?
- 16. truy cập đồng bộ trong clojure
- 17. Quản lý bộ nhớ/tài nguyên bằng MonoTouch và MonoTouch.Dialog
- 18. boost :: asio hoạt động và tài nguyên không đồng bộ
- 19. Đồng thời ghi vào các vị trí khác nhau trong cùng một dòng bộ nhớ cache
- 20. Giữ các tài nguyên i18n được đồng bộ hóa
- 21. Không thể truy cập Biểu tượng tài nguyên android/drawable
- 22. Truy cập tên tài nguyên theo lập trình
- 23. Cách truy cập tệp tài nguyên trong C#?
- 24. Trong ứng dụng Android, khi nào các tài nguyên được tải vào bộ nhớ?
- 25. Tài nguyên tĩnh lưu vào bộ nhớ cache được trả lại qua VirtualPathProvider
- 26. getClass(). GetClassLoader(). GetResourceAsStream() là bộ nhớ đệm tài nguyên
- 27. Cách tắt mã tcp không đồng bộ .NET sử dụng hết tài nguyên của hệ thống
- 28. Truy cập tài nguyên trong dự án thử nghiệm android
- 29. Cách truy cập tài nguyên trong tệp JAR?
- 30. Bản đồ có quyền truy cập đồng thời
Vâng, tôi đang sử dụng NSURLConnection. Hãy tưởng tượng chúng ta có một chu kỳ trên một mảng có thể thay đổi được, điều gì sẽ xảy ra nếu một tác vụ khác (kết nối thành công) cố thêm một đối tượng ở cuối mảng, trong khi chu trình đang thực hiện? Bạn có thể làm một ví dụ ngắn gọn về mã reentrant trong trường hợp này? – user236739
Đã thêm một vài câu nữa – Gruntcakes
Tuyệt vời, những dòng mới này thực sự làm rõ, cảm ơn. – user236739