2010-03-04 43 views
9

Tôi đã sử dụng api AddressBook của iPhone một thời gian rồi. Nhưng làm một số refactoring để cải thiện hiệu suất ứng dụng tôi đã quyết định "tái sử dụng" ABAddressBookRef trở lại bởi AddressBookCreate bởi vì tôi nhận thấy có những cải tiến hiệu suất lớn làm điều đó. Tuy nhiên, tôi nhận được lỗi EXEC_BAD_ACCESS bây giờ ngẫu nhiên, và tôi nghĩ lý do là trong "caveat" trong việc thực hiện tham chiếu iPhone: http://developer.apple.com/iphone/library/documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/300-BasicObjects/BasicObjects.html#//apple_ref/doc/uid/TP40007744-CH3-SW1Thao tác xử lý AddressBook đa luồng iPhone

Quan trọng: Trường hợp của ABAddressBookRef không thể được sử dụng bởi nhiều chủ đề. Mỗi luồng phải tạo một cá thể riêng bằng cách gọi ABAddressBookCreate. Bây giờ, tôi nghĩ rằng đơn giản chỉ có nghĩa là nó không phải là an toàn thread vì vậy tôi đã phải đồng bộ hóa truy cập vào API, nhưng có lẽ tôi đã sai, và có một số lý do khác khiến nhiều luồng lộn xộn cấu trúc dữ liệu?

Ai đó có thể xác nhận xem đó có thực sự là vấn đề an toàn cho luồng không (vì vậy @synchronize sẽ hoạt động) hoặc một số vấn đề khác?

Chúc mừng

Trả lời

11

Đây không phải là vấn đề về an toàn chủ đề ... không có cách nào để bạn giải quyết vấn đề bằng khóa. Các bình luận làm cho nó khá rõ ràng:

quan trọng: Trường hợp của ABAddressBookRef không thể được sử dụng bởi nhiều chủ đề. Mỗi chuỗi phải tạo ví dụ riêng bằng cách gọi ABAddressBookTạo.

Những gì bạn có thể làm là tạo một cá thể đơn lẻ của ABAddressBook và tạo kiến ​​trúc nhà sản xuất/người tiêu dùng sẽ quản lý quyền truy cập đối tượng.

Trình bao bọc sẽ có một chuỗi chính chỉ thực hiện một việc: đọc yêu cầu hoạt động từ hàng đợi chặn, sau đó thực hiện các thao tác trên sổ địa chỉ. Tất cả các chủ đề của bạn sẽ xếp hàng hoạt động của họ vào hàng đợi duy nhất và trình bao bọc sẽ thực hiện các hành động đó; nếu không có gì trong hàng đợi thì trình bao bọc sẽ chặn cho đến khi có thứ gì đó trong hàng đợi.

Điều này sẽ giải quyết được vấn đề không được phép sử dụng ABAddressBookRef từ nhiều chuỗi.

+0

Hi Lirik, vâng, tôi đã nhận được cùng một kết luận ... nó có vẻ như một cách rất xấu để xây dựng một khung AB phải trung thực .. nhà phát triển còn lại để xây dựng một (tương đối) phức tạp đa luồng giải pháp để giải quyết một vấn đề chung cần được kiến ​​trúc, nhưng những gì có thể làm .. Tôi sẽ phải bánh xe trong những khẩu súng lớn và làm điều đó một cách khó khăn .. cảm ơn bạn! – Marco

+0

Trên thực tế, tôi đã xây dựng một giải pháp khác trước khi đọc câu trả lời của bạn, nơi tôi đã lưu một từ điển ABRefs với tên luồng suy nghĩ (ngây thơ) rằng iPhone tái tạo các luồng từ một threadpool ... nhưng helas, không xúc xắc ... nó xây dựng một chủ đề mới mỗi khi bạn tách một ... vì vậy tôi cuối cùng đã nhận được cùng một kết luận của bạn – Marco

+0

@Lirik và @Marko, tôi có cùng một vấn đề. Tôi đã thấy vấn đề đa luồng và đã triển khai trình bao bọc AB khá đẹp từ đầu. Nhưng tôi vẫn có một lỗi lớn - đôi khi ứng dụng gặp sự cố và đôi khi nó xóa tất cả các liên hệ khỏi AB. Tôi đã kiểm tra tripple rằng tất cả các phương pháp sử dụng thể hiện AB làm điều đó từ thread được quản lý bởi wrapper này. –

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