Правильное использование: NSOperation и NSInvocationOperation

Я изучаю NSOperation и у меня есть сомнения относительно правильного способа реализации этого для моей ситуации.

В моем приложении я хочу выполнить много операций в фоновом режиме. Поскольку мое приложение может импортировать данные из настольного программного обеспечения, моя база данных может стать очень большой в зависимости от ситуации. При этом чтение и анализ данных могут занять несколько секунд, и я не хочу, чтобы мой пользовательский интерфейс был заморожен в течение этого времени.

Предположим, что у меня есть класс:

ClassX 
- (void) heavyOp1
- (void) heavyOp2
- (void) heavyOp3

Каждый хэвиОп связан с ClassX, поэтому имеет смысл, что они принадлежат к одному классу.

Мои вопросы и мои варианты:

1) должен ClassX быть подклассом NSOperation?

Я понимал, что операции должны представлять одну задачу, но мой класс предлагает 3 разные задачи. Я мог бы попытаться контролировать выполнение с помощью некоторых пользовательских конструкторов, но я думаю, что я, вероятно, нарушаю концепцию.

2) Использование NSInvocationOperation верно? Я не могу отменить это!

Я знаю, что могу сделать что-то подобное:

ClassX *myClassX = [[ClassX alloc] init];
NSInvocationOperation *myOp = [[NSInvocationOperation alloc] initWithTarget:myClassX selector:@selector(heavyOp1) object:nil];
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue myOp];

но если я позвоню [myQueue cancelAllOperations]; ClassX не будет отвечать на self.isCancelled потому что его нет в NSInvocationOperation,

Заставить класс распознать код [myOp addObserver:myClassX forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil]; работает, но опять же я думаю, что я нарушаю концепции.

3) Создать подкласс NSOperation для каждого метода HeavyOp из моего ClassX?

Это создаст много подклассов и может быть трудно управлять им, я не знаю, правильно ли это.

Итак, как правильно решить проблему? Кто-нибудь может дать мне совет? Возможно я ошибаюсь с одним из вариантов, которые я объяснил. Если что-то не понятно, просто спросите, и я постараюсь объяснить лучше.

1 ответ

Решение

Я склонен думать о NSInvocationOperation используется для ретро-подгонки операций и очередей к существующему коду. Если бы я начинал с нуля, или даже если бы я хотел более детальный контроль (возможность отмены, как вы упоминаете), я бы определенно создал подкласс (ы) NSOperation,

Не зная точно, каковы ваши тяжелые операции, трудно сказать с уверенностью, но я также был бы склонен создавать их как три отдельных класса. Отмена каждой операции может иметь разные вещи, которые необходимо сделать, поэтому ясно, что у вас есть код для выполнения этой отмены в отдельных классах.

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