Я просто запутался в этой проблеме и решил ее, используя гораздо более простую реализацию, чем другие, описанные здесь. Я просто использую методы, доступные в NSManagedObject
для работы с отношениями, когда не использую подклассы.
Пример реализации для вставки сущности в отношение NSOrderedSet
будет выглядеть следующим образом:
- (void)addAddress:(Address *)address
{
if ([self.addresses containsObject:address]) {
return;
}
// Use NSManagedObject's methods for inserting an object
[[self mutableOrderedSetValueForKey:@"addresses"] addObject:address];
}
Это прекрасно работает, и это то, что я использовал, прежде чем перейти к NSManagedObject
подклассам.
Есть два варианта:
1) Сделать обработчики событий потокобезопасными: использовать Control.Invoke / BeginInvoke
в любом обработчике событий. который должен взаимодействовать с потоком пользовательского интерфейса.
2) Сделайте маршалинг рабочего потока обратно потоку пользовательского интерфейса перед вызовом события - другими словами, используйте Control.Invoke
как часть процесса повышения событие, так что все обработчики событий будут вызываться в потоке пользовательского интерфейса. В зависимости от того, как структурировано ваше приложение, вы можете не захотеть, чтобы ваш компонент, генерирующий события, явно знал об интерфейсе пользователя - но когда он создается, вы можете передать ISynchronizeInvoke
(который Control
реализует), и ваш компонент может использовать это, чтобы вызывать свои события в правильном потоке. Конечно, это работает (во всяком случае, просто), если каждый обработчик событий может работать в одном потоке, но это часто так. Вы могли бы написать что-то вроде:
protected void OnFoo(EventArgs args)
{
if (sync != null && sync.InvokeRequired)
{
sync.Invoke((Action) delegate { OnFoo(args) }, null);
return;
}
EventHandler handler = Foo; // Where Foo is the event name
if (handler != null)
{
handler (this, args);
}
}
Если вы запускаете свое событие в коде, который выполняется вашим рабочим потоком, то все методы, подписанные на событие, будут выполняться в этом рабочем потоке.
Для элементов GUI вам необходимо посмотрите на Invoke-методы.
С уважением