2015-02-27 7 views
0

Я разрабатываю приложение с использованием SDK 8.1, Apple LLVM 6.0 и Xcode 6.1.1. Цель развертывания - 6.0. Я использую NSOperationQueue, и я хочу использовать QoS всякий раз, когда он доступен.Использование новых функций при поддержке старых версий iOS

код я использую:

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, но для этого значения не существует определения, которое может быть жестко запрограммировано.

Как это исправить?

+0

В дополнение к методу 'qualityOfService' нет необходимости проверять' & NSOperationQualityOfServiceUserInitiated'. Оба были добавлены вместе в iOS 8. – rmaddy

+0

Зачем использовать 'performSelector: withObject:' для вызова метода 'qualityOfService'? Просто вызовите метод напрямую. – rmaddy

+0

Если я попытаюсь использовать его напрямую, я получаю еще больше ошибок, например 'No visible @interface для NSOpertaionQueue объявляет селектор qualityOfService:':/Это не похоже на GCC ... – fpg1503

ответ

0

В коде есть несколько ошибок.

  1. NSOperationQualityOfServiceUserInitiated является родным типа (NSInteger), так что вы не можете использовать его так, что вы в любой линии.
  2. qualityOfService является собственностью типа NSQualityOfService. Ваша попытка передать аргумент методу qualityOfService (метод getter) не имеет смысла. Если вы пытаетесь установить качество обслуживания, вам нужно вызвать установщика, но вы не можете использовать performSelector.

Вы хотите:

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

Этот код будет компилироваться до тех пор, как ваша база SDK является IOS 8.0 или более поздней версии. Цель развертывания не имеет значения.

Если вы также хотите создать этот код с Xcode 5 или более ранней версией (базовый SDK iOS 7 или более ранней версии), вам необходимо обернуть код соответствующими директивами компилятора, чтобы проверить Base SDK.

+0

Извините, я хотел использовать установщик, но вы правы 'NSOperationQualityOfServiceUserInitiated' -' NSInteger'. Я использовал ваш код, заменяющий '@selector (qualityOfService)' на '@selector (setQualityOfService)'. Я пробовал это раньше, но он не работал, вероятно, это проблема с моей установкой Xcode, так как она перестает/начинает работать из ниоткуда:/ – fpg1503

+0

Вы должны использовать '@selector (setQualityOfService:)'. Обратите внимание на двоеточие в конце имени селектора. Это важно. – rmaddy

+0

Да, опечатка:/Но спасибо :) – fpg1503

 Смежные вопросы

  • Нет связанных вопросов^_^