Я думаю, что получил ответ @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()
, что может привести к возникновению исключения / неожиданного поведения.
Вы можете использовать NSLocale
, чтобы проверить валютную единицу, , но для имперских и метрических вы должны составить список самостоятельно del>.
К сожалению. Вы можете проверить имперские и метрические показатели. Есть клавиши NSLocaleMeasurementSystem
и NSLocaleUsesMetricSystem
.
Стоит упомянуть, что 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"
Я просто хотел отметить, что, как и в выпуске iOS8 , будут новые NSFormatters
по крайней мере для некоторых из упомянутых вами модулей.
Будут NSLengthFormatter
, NSMassFormatter
и NSEnergyFormatter
, которые очень просты в использовании - см. Этот учебник iOS8 NSFormatter . Вот пример использования NSLengthFormatter со swift:
let lengthFormatter = NSLengthFormatter()
println(@"Kilometer: %@", lengthFormatter.stringFromValue(1000, unit: .Kilometer)) //Kilometer: 1,000 km
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)
Я извлек этот метод в расширение 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)