Поиск расстояния, валюты, единиц измерения температуры и т. Д. Для страны (iPhone)

Я думаю, что получил ответ @Gray.

Позвольте мне перефразировать это для новичков, подобных мне, и попросить экспертов исправить меня, если я ошибаюсь.

Потребитель синхронизированный блок ::

synchronized (queue) {
    // this needs to be while
    while (queue.isEmpty()) {
       queue.wait();
    }
    queue.remove();
}

Синхронизируемый блок производителя ::

synchronized(queue) {
 // producer produces inside the queue
    queue.notify();
}

Предположим, что в данном порядке выполняется следующее:

1) потребитель №2 попадает в потребительский блок synchronized и ждет, когда очередь пуста.

2) Теперь производитель получает блокировку на queue и вставляет внутри очереди и вызывает notify ().

Теперь либо потребитель # 1 может быть выбран для запуска, который ждет блокировки queue для входа в блок synchronized в первый раз

или

потребитель # 2 можно выбрать для запуска.

3) скажем, что потребитель # 1 выбран для продолжения выполнения. Когда он проверяет условие, он будет правдой, и он remove() из очереди.

4) скажем, что потребитель №2 идет от того места, где он остановил свое выполнение (строка после wait() метод). Если условие «while» не существует (вместо условия if), он просто перейдет к вызову remove(), что может привести к возникновению исключения / неожиданного поведения.

23
задан skaffman 28 January 2010 в 12:34
поделиться

5 ответов

Вы можете использовать NSLocale, чтобы проверить валютную единицу, , но для имперских и метрических вы должны составить список самостоятельно .

К сожалению. Вы можете проверить имперские и метрические показатели. Есть клавиши NSLocaleMeasurementSystem и NSLocaleUsesMetricSystem.

29
ответ дан kennytm 28 January 2010 в 12:34
поделиться

Стоит упомянуть, что Apple предоставляет хорошую библиотеку (MKDistanceFormatter, представленную в iOS 7) для автоматического представления CLLocationDistance в качестве соответствующей строки для локали и языка данного пользователя.

Он делает небольшое нечеткое округление (например, 300 футов -> 350 футов -> 400 футов), но хорошо конвертирует между единицами (например, футами -> милями, когда это необходимо). Если вам не требуются действительно точные значения, этот класс идеально подходит для возврата приблизительных оценок расстояний в две строки кода.

MKDistanceFormatter *distanceFormatter = [[MKDistanceFormatter alloc] init];
[distanceFormatter setUnitStyle:MKDistanceFormatterUnitStyleAbbreviated]; // Optional
NSString *formattedDistance = [distanceFormatter stringFromDistance:100];
NSLog(@"%@",formattedDistance); // Prints "350 ft"

https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKDistanceFormatter_class/Reference/Reference.html

9
ответ дан mattv123 28 January 2010 в 12:34
поделиться

Я просто хотел отметить, что, как и в выпуске iOS8 , будут новые NSFormatters по крайней мере для некоторых из упомянутых вами модулей.

Будут NSLengthFormatter, NSMassFormatter и NSEnergyFormatter, которые очень просты в использовании - см. Этот учебник iOS8 NSFormatter . Вот пример использования NSLengthFormatter со swift:

let lengthFormatter = NSLengthFormatter()
println(@"Kilometer: %@", lengthFormatter.stringFromValue(1000, unit: .Kilometer))       //Kilometer: 1,000 km
8
ответ дан Alexander 28 January 2010 в 12:34
поделиться

Swift:

1.)

import MapKit

2.) Поскольку создание форматтера стоит дорого, лучше установить его в качестве свойства lazy. Таким образом, вы можете инициализировать средство форматирования только тогда, когда это необходимо, и повторно использовать средство форматирования, а не создавать новое.

lazy var distanceFormatter: MKDistanceFormatter = {
    var tempDistanceFormatter =  MKDistanceFormatter()
    tempDistanceFormatter.unitStyle = .Abbreviated // .abbreviated in Swift 3

    return tempDistanceFormatter
}()

3.)

let distanceString = self.distanceFormatter.stringFromDistance(yourDistance)
2
ответ дан Brian 28 January 2010 в 12:34
поделиться

Я извлек этот метод в расширение String. Выглядит элегантно

Swift 4.1 версия

import MapKit

extension String {
    init(distance: Double ) {
        let mkDistanceFormatter = MKDistanceFormatter()
        mkDistanceFormatter.unitStyle = .abbreviated
        self = mkDistanceFormatter.string(fromDistance: distance)
    }
}

Использование

let distance = Double(34234.0)
let stringDistance String(distance:distance)
0
ответ дан Tony Macaren 28 January 2010 в 12:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: