Это, конечно, не о "сеансовых ключах", поскольку это обычно используется для обращения к sessionless аутентификации, которая выполняется в рамках всех ограничений REST. Каждый запрос самоописывает, содержа достаточно информации для авторизации запроса самостоятельно без любого состояния приложения серверной стороны.
самый легкий способ приблизиться к этому путем запуска со встроенных механизмов аутентификации HTTP в RFC 2617 .
Если вы точно знаете, какие поля вы получите, вы можете использовать один вызов sscanf ()
:
const char *stringToParse = ...;
int days, hours, minutes, seconds;
NSTimeInterval interval;
if(sscanf(stringToParse, "P%dDT%dH%dM%sS", &days, &hours, &minutes, &seconds) == 4)
interval = ((days * 24 + hours) * 60 + minutes) * 60 + seconds;
else
; // handle error, parsing failed
Если какое-либо из полей может быть опущено, вам нужно быть немного умнее в вашем синтаксическом анализе, например:
const char *stringToParse = ...;
int days = 0, hours = 0, minutes = 0, seconds = 0;
const char *ptr = stringToParse;
while(*ptr)
{
if(*ptr == 'P' || *ptr == 'T')
{
ptr++;
continue;
}
int value, charsRead;
char type;
if(sscanf(ptr, "%d%c%n", &value, &type, &charsRead) != 2)
; // handle parse error
if(type == 'D')
days = value;
else if(type == 'H')
hours = value;
else if(type == 'M')
minutes = value;
else if(type == 'S')
seconds = value;
else
; // handle invalid type
ptr += charsRead;
}
NSTimeInterval interval = ((days * 24 + hours) * 60 + minutes) * 60 + seconds;
Я нашел в этой статье Википедии ссылку на то, как на самом деле работает ISO-8601. Я не эксперт по какао, но держу пари, если вы сможете проанализировать эту строку и извлечь компонентный час, минуту, секунду, день и т. Д., Получить ее в NSTimeInterval должно быть легко. Сложная часть - это разобрать. Я бы сделал это примерно так:
Во-первых, разделил бы строку на две отдельные строки: одна представляет дни, а вторая - время. NSString имеет метод экземпляра componentsSeparatedByString: NSString, который возвращает NSArray подстрок исходного NSString, разделенных переданным вами параметром. Это будет выглядеть примерно так:
NSString* iso8601 = /*However you're getting your string in*/
NSArray* iso8601Parts = [iso8601 componentsSeparatedByString:@"T"];
Затем выполните поиск первого элемента iso8601Parts для каждого возможного дня индикаторы продолжительности (Y, M, W и D). Когда найдешь, захватить все предыдущие цифры (и, возможно, десятичную точку), преобразовать их в число с плавающей запятой и где-нибудь сохранить. Помните, что если был только элемент времени, то iso8601Parts [0] будет пустой строкой.
Затем проделайте то же самое, ища части времени во втором элементе iso8601Parts для возможных индикаторов времени (H, M, S ). Помните, что если был только дневной компонент (то есть в исходной строке не было символа 'T'), тогда iso8601Parts будет иметь длину только один, и попытка доступа ко второму элементу вызовет исключение за пределами .
NSTimeInterval - это просто длительное хранение нескольких секунд, поэтому преобразуйте отдельные фрагменты, которые вы вытащили, в секунды, сложите их вместе, сохраните их в своем NSTimeInterval, и все готово.
Извините, я знайте, что вы просили "простой" способ сделать это,