是否可以使用不同的参数类型覆盖NSOperation的completionBlock属性?

时间:2015-03-13 10:45:46

标签: objective-c cocoa objective-c-blocks nsoperation

Marcus Zarra's "Core Data" (2nd edition)本书列出了一个示例,在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 个答案:

答案 0 :(得分:2)

  

原子性属性怎么样?

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)