Безопасность и производительность потока в адресной книге

Исходя из документации по адресной книге и моего понимания реализации CoreData, я полагаю, что адресная книга должна быть поточно-ориентированной, и выполнение запросов из нескольких потоков не должно создавать проблем. Но у меня возникают проблемы с поиском каких-либо подробных обсуждений безопасности потоков в документах Это поднимает несколько вопросов:

  • Безопасно ли использовать + sharedAddress Book в нескольких потоках для доступа только для чтения? Я верю, что ответ - да.
  • Похоже, что для доступа на запись в фоновых потоках вы должны использовать + address Book (и сохранить изменения вручную). Я правильно понимаю?
  • Кто-нибудь исследовал влияние на производительность выполнения нескольких одновременных запросов к адресной книге в нескольких потоках? Это должно быть очень похоже на производительность выполнения нескольких запросов CoreData в нескольких потоках. Я чувствую, что я бы мало выиграл, делая параллельные запросы, так как я предполагаю, что они будут сериализованы, когда они нажмут SQLLite, но я не уверен здесь.

Мне нужно сделать десятки запросов (некоторые сложные) к Address Book, и я делаю это в фоновом потоке, используя NSOperation, чтобы избежать блокировки пользовательского интерфейса (что он в настоящее время делает). Мой основной вопрос заключается в том, имеет ли смысл устанавливать максимальное число одновременных операций на значение, большее 1, и существует ли какая-либо опасность в этом случае, если приложение может одновременно выполнять запись в Address Book в другом потоке.

1 ответ

Решение

Если API не говорит, что это потокобезопасно, это не так. Даже если текущая реализация оказывается поточно-ориентированной, в будущем это может не произойти. Другими словами, не используйте AB из нескольких потоков.

Кроме того, что на основе CoreData заставляет вас думать, что это будет потокобезопасным? CoreData использует модель ограничения потока, в которой доступ к контексту в одном потоке является безопасным, все объекты из контекста должны быть доступны в одном потоке.

Это означает, что sharedAddressBook не будет потокобезопасным, если он хранит NSManagedObjectContext для использования. Это было бы безопасно, только если AB создает новый контекст каждый раз, когда ему нужно что-то сделать, и немедленно избавляется от него, или если он создает контекст для каждого потока и всегда использует соответствующий контекст (возможно, путем сохранения ссылки на него в threadDictionary), В любом случае было бы небезопасно хранить что-либо как NSManagedObjects, так как контексты будут постоянно уничтожаться, что означает, что каждый ABRecord должен будет хранить NSManagedObjectID, чтобы он мог воссоздать объект в соответствующем контексте, когда бы он ему не понадобился.

Очевидно, что все это возможно, это может быть тем, что сделано, но вряд ли это очевидная реализация.

Другие вопросы по тегам