Можно ли переопределить свойство completeBlock NSOperation с различными типами параметров?

В книге "Основные данные" (2-е издание) Маркуса Зарры приведен пример, в котором NSOperation подкласс он отменяет completionBlock имущество:

@property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0);

с

typedef void (^ExportCompletionBlock)(NSData *jsonData, NSError *error);
@property (nonatomic, copy) ExportCompletionBlock completionBlock;

который в Xcode 6 под 10.10 приводит к следующим предупреждениям:

‘atomic’ attribute on property ‘completionBlock’ does not match the property inherited from ‘NSOperation’

а также

Property type ‘ExportCompletionBlock’ (aka ‘void(^)(NSData *_strong, NSError *_strong)’) is incompatible with type ‘void(^)(void)’ inherited from ‘NSOperation’

Теперь мне интересно, что я должен сделать из этих предупреждений.
Как насчет атрибута атомарности?
Можно ли менять параметры, несмотря на предупреждение?
Есть ли другое, лучшее решение, которое не включает изменение параметров блока?

1 ответ

Решение

Как насчет атрибута атомарности?

Исходя из atomic в nonatomic действительно сбивает с толку. NSOperation - это то место, где необходимы атомные свойства. Если у вас нет очень веских причин, я бы придерживался atomic,

Можно ли менять параметры, несмотря на предупреждение?

Предупреждение там по причине. completionBlock ожидается, что свойство будет работать определенным образом, если оно каким-то образом вызывается с его оригинальной подписью (self.completionBlock()) вместо переопределенной подписи (self.completionBlock(jsonData, error)), тогда ваше приложение будет зависать.

Есть ли другое, лучшее решение, которое не включает изменение параметров блока?

Не переопределять completionBlock, Вы не обязаны использовать completionBlockсоздайте новое свойство с другим именем. Например, в вашем подклассе вы можете использовать exportCompletionBlock:

@property (atomic, copy) ExportCompletionBlock exportCompletionBlock;

Затем в -main, вызов self.exportCompletionBlock(jsonData, error) когда операция закончилась вместо self.completionBlock(jsonData, error),

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