scheduleNotification
создаёт нотификации с одним и тем же id. Новые нотификации перетирают старые. Лучше в качестве id использовать или константы, или что-то связанное с заголовком: "\(content.title.hash)"
.func scheduleNotification(inSeconds seconds:TimeInterval, text: String, completion: (Bool) -> ())
. Тогда можно будет его использовать для создания нотификации: content.title = text
.deinit
нужно убрать совсем. Он удаляет вашу нотификацию при удалении экрана из памяти.viewDidLoad()
из этого же класса. deleteFood(IndexPath)
и отдельно var animatableChanges: ((OldData, NewData) -> Void)?
куда View может засунуть свой байндинг. Такой подход позволяет ViewModel обновлять вьюху тогда, когда она посчитает нужным, а с другой стороны держать код всех байндингов в одном месте (к примеру, в специальном методе, вызываемом из viewDidLoad
). func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
URLSession.shared.dataTask(with: navigationAction.request) { [weak webView] (data, _, _) in
decisionHandler(.cancel)
guard let html = data.flatMap({ String(data: $0, encoding: .utf8) }) else {
return
}
webView?.loadHTMLString(html, baseURL: navigationAction.request.url)
}.resume()
}
typealias ResultsArray = [[(homeTeam: (name: String, score: String), guestTeam: (name: String, score: String))]]
//для сравнения, ваша структура:
typealias YourStructure = [[[String: String]]
DispatchQueue.main.async { [weak self] in
self?.label.text = temp
}
weakSelf
не стоит. просто [weak self]
отлично работает. В такой ситуации код читается легче и подсветка синтаксиса работает корректнее;if let source = parsedObject as? [String: Any], let text = source["text"] as? [String] {
for temp in text {
print(temp)
self?.label.text = temp
}
}
var cycles = 0
, поставьте условие if i + 1 > exersiseName.count
первым и модифицируйте следующим образом:if i + 1 > exersiseName.count { //Конец цикла
count+=1
if (count >= sets) {
timerLabel.text = "0"
timer.invalidate()
timerRunning = false
}else{
i = 0
}
} //важно: не надо ставить здесь else
if ....
CMAttitude
имеет свойство rotationMatrix
, которое позволяет преобразовать координаты из СК, связанной с телефоном, в СК, связанную с Землей. С помощью нее можно определить ускорение строго вдоль вертикальной оси:CMRotationMatrix *attitude = motionManager.deviceMotion.attitude.rotationMatrix;
CMAcceleration *acceleration = motionManager.accelerometerData.acceleration;
double ay = attitude.m21*acceleration.x + attitude.m22*acceleration.y + attitude.m23*acceleration.z;
motionManager
должен быть проинициализирован и активирован.