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

时间:2015-02-27 17:21:02

标签: ios objective-c ios8 nsoperationqueue legacy-code

我正在使用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
}

我得到的错误是:

  

使用未声明的标识符'NSOperationQualityOfServiceUserInitiated'

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

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

我该如何解决?

1 个答案:

答案 0 :(得分:0)

代码有几个问题。

  1. NSOperationQualityOfServiceUserInitiated是原生类型(NSInteger),因此您无法按照自己的方式使用它。
  2. qualityOfServiceNSQualityOfService类型的属性。您尝试将参数传递给qualityOfService方法(getter方法)是没有意义的。如果您尝试设置服务质量,则需要致电设置器,但无法使用performSelector
  3. 你想:

    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)构建此代码,则需要使用适当的编译器指令包装代码以检查Base SDK。