在支持旧 iOS 版本的同时使用新功能

Using new features while supporting older iOS versions

我正在使用 SDK 8.1、Apple LLVM 6.0 和 Xcode 6.1.1 开发应用程序。部署目标是 6.0。我正在使用 NSOperationQueue,并且我想在可用时使用 QoS。

我使用的代码是:

if ([self.operationQueue respondsToSelector:@selector(setQualityOfService:)] 
     && (&NSOperationQualityOfServiceUserInitiated)) {
    [self.operationQueue performSelector:@selector(setQualityOfService:) withObject: NSOperationQualityOfServiceUserInitiated];
} else {
    //Other stuff not related to the scope of this question
}

我得到的错误是:

Use of undeclared identifier 'NSOperationQualityOfServiceUserInitiated'

我添加了 if (&NSOperationQualityOfServiceUserInitiated) 部分来检查这个常量是否存在。此代码适用于旧版本的 Xcode/Obj-C 编译器。

我可以将选择器与 performSelectorWithIdentifier 一起使用,但是那些在文档中没有定义值的常量呢?此常量的值由 NSQualityOfServiceUserInitiated 设置,但没有可以硬编码的此值的定义。

我该如何解决?

代码有几处错误。

  1. NSOperationQualityOfServiceUserInitiated 是原生类型 (NSInteger),因此您不能像在任何一行中那样使用它。
  2. qualityOfService 是类型 NSQualityOfService 的 属性。您尝试将参数传递给 qualityOfService 方法(getter 方法)没有任何意义。如果你想设置服务质量,你需要调用 setter 但你不能使用 performSelector.

你想要:

if ([self.operationQueue respondsToSelector:@selector(qualityOfService)]) {
    self.operationQueue.qualityOfService = NSOperationQualityOfServiceUserInitiated;
} else {
    //Other stuff not related to the scope of this question
}

只要您的 Base SDK 是 iOS 8.0 或更高版本,此代码就可以正常编译。部署目标无关紧要。

如果您还想使用 Xcode 5 或更早版本(iOS 7 或更早版本的 Base SDK)构建此代码,则需要使用正确的编译器指令包装代码以进行检查对于基础 SDK。