2012-06-15 48 views
5

Ứ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

1

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à 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.

+0

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

+0

Đã thêm một vài câu nữa – Gruntcakes

+0

Tuyệt vời, những dòng mới này thực sự làm rõ, cảm ơn. – user236739

1

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

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