{"id":408707,"date":"2024-06-29T20:20:01","date_gmt":"2024-06-29T20:20:01","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=408707"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T20:20:01","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=408707","title":{"rendered":"<span>Combine: \u0447\u0430\u0441\u0442\u044c 2. \u0412\u0435\u0440\u0448\u0438\u043d\u0430 \u0430\u0439\u0441\u0431\u0435\u0440\u0433\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0421\u0435\u0440\u0433\u0435\u0439, iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 SimbirSoft.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/company\/simbirsoft\/blog\/712332\/\"><u>\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/u><\/a>\u00a0\u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Combine \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0441 RxSwift. <\/p>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Combine\u00a0\u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u2014 \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u0435\u0448\u0435\u0432\u043b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0434\u043d\u044b\u043c. \u0415\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u2014 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0441\u043e\u0438\u0441\u043a\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>Combine \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0435\u0433\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 SwiftUI).<\/p>\n<\/li>\n<\/ol>\n<p>\u00a0\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u0438\u0434\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Combine, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/05c\/397\/427\/05c397427cea265c003b461dc1544007.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/05c\/397\/427\/05c397427cea265c003b461dc1544007.png\"\/><\/figure>\n<h2>\u041f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b<\/h2>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u0432, \u0442\u043e \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a \u043d\u0438\u043c, \u043d\u043e \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0431\u0435\u0440\u0435\u0433\u0443.<\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>@Published<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b \u2014 <strong>NotificationCenter<\/strong>, <strong>URLSession<\/strong>, <strong>Timer<\/strong>.<\/p>\n<p>\u0427\u0435\u043c \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>@Published<\/code>? \u0422\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 SwiftUI, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438. \u0414\u0430 \u0438 \u043c\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430\u043c\u0438? NotificationCenter \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442, \u0438 \u043e \u043d\u0435\u043c \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0435\u0447\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c. URLSession \u043b\u0438\u0431\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0447\u043a\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043b\u0438\u0431\u043e\u00a0 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438. Timer \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0434\u043a\u0438\u0445 \u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0430\u0441 \u0431\u0435\u0437 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0439\u0434\u0443\u0441\u044c \u043f\u043e \u043d\u0430\u0448\u0438\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043c \u043d\u043e\u043d \u0433\u0440\u0430\u0442\u0430.<\/p>\n<p><strong>@Published<\/strong> \u2014 \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 SwiftUI, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043b\u043e\u0445\u043e \u0434\u0440\u0443\u0436\u0438\u0442 \u0441 UIKit-\u043e\u043c. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb \u043a\u0430\u043a willSet, \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0438\u0441\u043a, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u044f\u0442\u0441\u044f \u043d\u0430 UI, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c (\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438\u00a0\u0432 <a href=\"https:\/\/developer.apple.com\/documentation\/combine\/published\"><u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Apple<\/u><\/a>). \u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.swiftbysundell.com\/articles\/published-properties-in-swift\/\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<p><strong>NotificationCenter<\/strong> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0430\u043a \u043f\u0440\u043e\u0431\u043a\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u0421 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043b\u043e\u0432\u0438\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e\u00a0\u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043b\u0438\u0448\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043b\u0438\u0431\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.\u00a0\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043c\u0435\u043d\u044b \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.\u00a0<\/p>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">    private func addOldObserverForNotification() {         NotificationCenter.default             .addObserver(                 self,                 selector: #selector(catchNotification),                 name: UIApplication.didEnterBackgroundNotification,                 object: nil             )     }      @objc     private func catchNotification() {         print(\"catched old notification\")     }<\/code><\/pre>\n<p>\u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">    private var bag = Set&lt;AnyCancellable>()     private func subscribeForNotification() {         NotificationCenter.default             .publisher(for: UIApplication.didEnterBackgroundNotification)             .sink { notification in                 print(notification.name.rawValue)             }             .store(in: &amp;bag)     }<\/code><\/pre>\n<p><strong>\u0412 \u0447\u0435\u043c \u043f\u043b\u044e\u0441\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434 \u0441\u0442\u0430\u0440\u044b\u043c?<\/strong><\/p>\n<ol>\n<li>\n<p>\u0423\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441. \u0415\u0441\u043b\u0438 Combine \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c \u0438 \u043b\u0435\u0433\u043a\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0445\u043e\u0434\u044f\u0442 \u043b\u0435\u0433\u0430\u0441\u0438 Objective-C \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b, \u0430 \u0441 \u043d\u0438\u043c\u0438 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<p><strong>URLSession<\/strong> \u2014 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\u00a0\u0415\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0434\u0443\u0440\u0430\u043a\u0430\u00bb. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435\u00a0\u043b\u0438\u0431\u043e \u0432 \u0431\u044d\u043a\u0433\u0440\u0430\u0443\u043d\u0434\u0435\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>.subscribe(on: _)<\/code>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>.subscribe(on: DispatchQueue.main)<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d:<\/p>\n<pre><code class=\"swift\">    private func fetchData(from url: URL) -> AnyPublisher&lt;[String], Never> {         URLSession.shared.dataTaskPublisher(for: url)             .map { $0.data }             .decode(type: [String].self, decoder: JSONDecoder())             .replaceError(with: [])             .subscribe(on: DispatchQueue.main)             .receive(on: DispatchQueue.main)             .eraseToAnyPublisher()     }<\/code><\/pre>\n<p><strong>Timer<\/strong> \u2014 \u0442\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u043f\u043e\u0447\u0442\u0443 \u044e\u0437\u0435\u0440\u0430, \u043d\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u043c\u0438\u0442\u044c.<\/p>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in } RunLoop.main.add(timer, forMode: .default) timer.invalidate()<\/code><\/pre>\n<p>\u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">let timer = Timer.publish(every: 1, on: .main, in: .default)<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 NotificationCenter\u00a0\u0442\u0430\u0439\u043c\u0435\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u043b\u043e\u0436\u0443\u0440\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0435\u0435.<\/p>\n<p>\u0415\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430. Timer Publisher \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u00a0\u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:\u00a0\u043b\u0438\u0431\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>timer.connect()<\/code> \u0434\u043b\u044f \u043c\u0430\u043d\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u044e\u0437\u0435\u0440\u043e\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\u00bb), \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>timer.autoconnect()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0442\u0430\u0439\u043c\u0435\u0440, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041c\u0430\u043d\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/strong>  <\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>timer<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .sink { secondsLeft in<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print(secondsLeft)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 }<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .store(in: &amp;bag)<\/code><\/p>\n<p align=\"left\"><code>timer.connect()<\/code><\/p>\n<\/td>\n<td>\n<p><code>timer<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .autoconnect()<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .sink { secondsLeft in<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print(secondsLeft)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 }<\/code><\/p>\n<p align=\"left\"><code>\u00a0\u00a0\u00a0 .store(in: &amp;bag)<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0440\u0443\u0447\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code>.invaidate())<\/code>.<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u043d\u043e\u0432\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043c\u0435\u043d\u0438\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u041c\u0435\u0442\u043e\u0434 <code>.sink()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c AnyCancellable \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u0435\u0440\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0438\u0440\u0430\u0435\u0442 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430.<\/p>\n<p>\u0423 AnyCancellable \u0435\u0441\u0442\u044c 2 \u043c\u0435\u0442\u043e\u0434\u0430: <\/p>\n<p><strong>.cancel()<\/strong> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e AnyCancellable \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0434\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<p><strong>.store(in:)<\/strong>\u00a0\u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\u00a0<\/p>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b \u0432 Combine<\/h2>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2014 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438\u00a0\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0438\u0445 \u0434\u0435\u043b\u0438\u043c.<\/p>\n<p><strong>\u041f\u043e \u044d\u043c\u0438\u0442\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439:<\/strong><\/p>\n<ol>\n<li>\n<p>One-shot \u2014\u00a0\u043e\u0442\u0434\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e 1 \u0440\u0430\u0437 \u0438 \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u044e\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0421ontinuous broadcasting \u2014\u00a0\u043e\u0442\u0434\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u043e \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443:<\/strong><\/p>\n<ol>\n<li>\n<p>Hot \u2014 \u044d\u0433\u043e\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b. \u0418\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0435\u0441\u0442\u044c \u0443 \u043d\u0438\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0435\u0441\u0442\u044c, \u043e\u043d\u0438 \u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u00ab\u043d\u0430 \u0442\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435\u00bb \u043d\u0435\u043a\u043e\u043c\u0443 \u0441\u043b\u0443\u0448\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>Cold \u2014 \u0431\u0443\u0434\u0443\u0442 \u0441\u043c\u0438\u0440\u0435\u043d\u043d\u043e \u0436\u0434\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u043d\u0430 \u043d\u0438\u0445 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442\u0441\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u043e \u0442\u0438\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0445:<\/strong><\/p>\n<ol>\n<li>\n<p>Just (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Empty (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Optional (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Result (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Future (one-shot, hot)<\/p>\n<\/li>\n<li>\n<p>Sequence (cb, cold)<\/p>\n<\/li>\n<li>\n<p>Subject (cb, hot) \u2014 PassthroughSubject, CurrentValueSubject<\/p>\n<\/li>\n<li>\n<p>NotificationCenter (cb, hot)<\/p>\n<\/li>\n<li>\n<p>URLSession (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p> Timer (cb, hot\/cold)<\/p>\n<\/li>\n<li>\n<p> \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Publisher<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u0432, \u043d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043a\u043e\u0434\u0443, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a <code>.sink<\/code>:<\/p>\n<p><strong>completion<\/strong>\u00a0\u2014 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0435\u0442.<\/p>\n<p><strong>value<\/strong>\u00a0\u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430.<\/p>\n<pre><code class=\"swift\">    .sink(         receiveCompletion: {             print(\"status: \\($0)\")         },         receiveValue: {             print(\"value: \\($0)\")         }     )<\/code><\/pre>\n<h2>Optional<\/h2>\n<p>Optional \u2014 \u044d\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u0435\u0442.<\/p>\n<p>\u0415\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <code>value == nil<\/code>, \u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0435\u0442, \u0430 \u0432 \u0431\u043b\u043e\u043a\u0435 recieveCompletion \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u00ab\u0432\u0441\u0451\u00bb. <\/p>\n<pre><code class=\"swift\">var intValue: Int? = nil let optionalPublisher: Optional&lt;Int>.Publisher = intValue.publisher  optionalPublisher     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"received value: \\(value)\")         }     )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">completion status: finished<\/code><\/pre>\n<p>\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e nil, \u0442\u043e \u0432 \u0431\u043b\u043e\u043a\u0435 receiveValue \u043e\u043d\u043e \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043e \u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 guard \u0438\u043b\u0438 if-let.<\/p>\n<pre><code class=\"swift\">var intValue: Int? = 10<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">received value: 10 completion status: finished<\/code><\/pre>\n<p><strong>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b<\/strong> \u2014 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0435\u0434\u043a\u0438\u0439 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Just.<\/p>\n<h2>Just<\/h2>\n<p><strong>Just <\/strong>\u2014 \u044d\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u0435\u0442.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 Data stream:<\/p>\n<pre><code class=\"swift\">let stringPublisher: Just&lt;String> = Just(\"?\")  stringPublisher     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"received value: \\(value)\")         }     )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">received value: ? completion status: finished<\/code><\/pre>\n<p>\u0423 Just \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u0430). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 output \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 String, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u0434 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"swift\">let stringPublisher: Just&lt;String?> = Just(nil)  stringPublisher     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"recieved value: \\(value)\")         }     )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">recieved value: nil completion status: finished<\/code><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e Just \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e\u00a0\u0435\u0433\u043e \u0442\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438 \u2014 Never, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u043a\u0430\u0436\u0435\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438\u0434\u0435\u0442 nil, \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u0438 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 Output \u0438 Error, \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 Just \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 Result.<\/p>\n<h2>Result\u00a0<\/h2>\n<p><strong>Result<\/strong>\u00a0\u2014 \u044d\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439\u00a0\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043b\u0438\u0431\u043e \u043e\u0448\u0438\u0431\u043a\u0443. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435\u0433\u043e 1 \u0440\u0430\u0437, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u0435\u0442.<\/p>\n<pre><code class=\"swift\">enum ResultError: Error {     case testError } let error: ResultError = .testError let value = 10 var result: Result&lt;Int, Error> = .failure(error) let resultPublisher: Result&lt;Int, Error>.Publisher = result.publisher resultPublisher     .sink(         receiveCompletion: { completion in             switch completion {             case .finished:                 print(\"completion status: \\(completion)\")             case .failure(let error):                 print(\"recieved error: \\(error)\")             }         }, receiveValue: { value in             print(\"received value: \\(value)\")         }     )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">recieved error: testError<\/code><\/pre>\n<pre><code class=\"swift\">var result: Result&lt;Int, Error> = .success(value)<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">received value: 10  completion status: finished<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0437\u0430\u0432\u0435\u0437\u043b\u0438 Combine \u0438 \u0432 \u043d\u0435\u043c \u043f\u043e\u043b\u043d\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 \u0434\u043e\u0431\u0440\u044b\u0445 \u043a\u043b\u043e\u0436\u0443\u0440\u043a\u0430\u0445:<\/p>\n<pre><code class=\"swift\">func fetchData(completion: @escaping (Result&lt;Int, Error>) -> Void) {     completion(.success(10)) }<\/code><\/pre>\n<p>\u041c\u043e\u0433\u043b\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e Result \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043e\u0442\u0434\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 <code>@escaping<\/code> <code>closure<\/code>. \u041d\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430 \u043d\u0435\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u0414\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 Combine \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u2014 Future.<\/p>\n<h2>Future<\/h2>\n<p><strong>Future<\/strong>\u00a0\u2014 \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Result, Future \u2014 \u044d\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043b\u0438\u0431\u043e \u043e\u0448\u0438\u0431\u043a\u0443. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435\u0433\u043e 1 \u0440\u0430\u0437, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u0435\u0442. \u041e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0436\u0438\u0432\u0435\u0442 \u043f\u0440\u043e\u043c\u0438\u0441:<\/p>\n<pre><code>typealias Promise = (Result&lt;Output, Failure>) -> Void<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441 \u043a\u043b\u043e\u0436\u0443\u0440\u043a\u043e\u0439:<\/p>\n<pre><code class=\"swift\">func fetchData(completion: @escaping (Result&lt;Int, Error>) -> Void) {     completion(.success(10)) }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Future \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e \u043c\u0435\u0441\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043b\u0430\u0434:<\/p>\n<pre><code class=\"swift\">func fetchDataAsPublisher() -> Future&lt;Int, Error> {     Future { promise in         fetchData { completion in             promise(completion)         }     } }<\/code><\/pre>\n<p>\u0412\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0433\u043b\u0430\u0432\u044b \u043c\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438 \u043f\u0440\u043e \u00ab\u0445\u043e\u043b\u043e\u0434\u043d\u044b\u0435\u00bb (Cold) \u0438 \u00ab\u0433\u043e\u0440\u044f\u0447\u0438\u0435\u00bb (Hot) \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b?\u00a0\u0421\u0430\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 Future \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u044f\u0441\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u00ab\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u00bb \u043d\u0443\u0436\u043d\u043e\u0435 \u0435\u043c\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c Future \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u043c\u0435\u043d\u0435\u0435 \u044d\u0433\u043e\u0438\u0441\u0442\u0438\u0447\u043d\u043e \u0438 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430, \u043d\u0430\u0434\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432 \u0431\u043b\u043e\u043a Deferred {\u00a0}. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.donnywals.com\/using-promises-and-futures-in-combine\/\"><u>\u0442\u0443\u0442.<\/u><\/a><\/p>\n<h2>Subject<\/h2>\n<p><strong>Subject<\/strong> \u2014 \u044d\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437\u0432\u043d\u0435 \u0440\u0443\u0447\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041e\u043d \u0432\u044b\u0440\u0430\u0436\u0435\u043d \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u0441 \u0434\u0432\u0443\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438:<\/p>\n<p><strong>.send()<\/strong>\u00a0\u2014 \u00a0\u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p><strong>.send(completion: )<\/strong>\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p><strong>Subject<\/strong>\u00a0\u0441\u043e\u0437\u0434\u0430\u043d \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u043a\u0443\u0441\u043a\u0430\u043c\u0438 \u043a\u043e\u0434\u0430. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Future,\u00a0\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 \u043d\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0441 <code>@escaping closure<\/code>. \u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Future \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Subject \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f one-shot \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 Data-stream \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>\u0423 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u0435\u0441\u0442\u044c 2 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <strong>PassthroughSubject<\/strong> \u0438\u00a0<strong>CurrentValueSubject<\/strong>.<\/p>\n<p><strong>PassthroughSubject<\/strong> \u2014 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u041f\u041e\u0421\u041b\u0415 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f. \u042d\u0442\u043e\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432 \u2014 \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0437\u0430\u0431\u044b\u043b\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">let subject = PassthroughSubject&lt;Int, Never>()  subject.send(2) subject.send(3)  subject     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"received value: \\(value)\")         }     )  subject.send(4) subject.send(completion: .finished)<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">received value: 4 completion status: finished<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435\u00a0\u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0438\u043f\u0430 Int \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0444\u0435\u0439\u043b\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>.send<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u044b (2,3), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442 (4) \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041d\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432\u044b\u0432\u0435\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e 2 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f: \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 Int \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 finished.<\/p>\n<p><strong>CurrentValueSubject<\/strong> \u2014 \u043f\u043e\u0447\u0442\u0438 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 PassthroughSubject, \u043d\u043e \u0441 \u0440\u044f\u0434\u043e\u043c \u043e\u0442\u043b\u0438\u0447\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e value, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043a \u043d\u0435\u043c\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u041f\u041e\u0421\u041b\u0415 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438, \u043d\u043e\u00a0\u0438 \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u0441\u0435\u0431\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0414\u041e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a (\u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430, \u043b\u0438\u0431\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0435\u0441\u043b\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0443\u0441\u043f\u0435\u043b \u0447\u0442\u043e-\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043d\u0430 \u043d\u0435\u0433\u043e \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0435\u0441\u043b\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0447\u0430\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"swift\">let subject = CurrentValueSubject&lt;Int, Never>(1) \/\/ \u0437\u0430\u0442\u0435\u0440\u043b\u043e\u0441\u044c .send(2)  subject.send(2) \/\/ \u0437\u0430\u0442\u0435\u0440\u043b\u043e\u0441\u044c .send(3) subject.send(3)  subject     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"received value: \\(value)\")         }     )  subject.send(4) subject.send(completion: .finished)  print(\"last value: \\(subject.value)\")<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">received value: 3 received value: 4 completion status: finished last value: 4<\/code><\/pre>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043e\u0431\u043e\u0438\u043c\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430\u043c\u0438 Subject, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u043b\u0438\u0448\u0435\u043d\u0430 \u0435\u0449\u0435 \u043a\u0430\u043a\u043e\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 (\u043d\u0438 \u043a\u0440\u0430\u0448\u0435\u0439, \u043d\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430), \u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442.<\/p>\n<pre><code class=\"swift\">subject.send(4) subject.send(completion: .finished) subject.send(10)<\/code><\/pre>\n<h2>Publisher Type Erasure<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 Combine. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043d\u0430 \u043d\u0438\u0445 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"320\" width=\"320\">\n<p align=\"left\">Name<\/p>\n<\/td>\n<td>\n<p align=\"left\">Data type<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"320\" width=\"320\">\n<p align=\"left\">Optional<\/p>\n<\/td>\n<td>\n<p><u>Optional<\/u>&lt;<u>Int<\/u>>.<u>Publisher<\/u>  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"320\" width=\"320\">\n<p align=\"left\">Just<\/p>\n<\/td>\n<td>\n<p align=\"left\"><u>Just<\/u>&lt;<u>Int<\/u>><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"320\" width=\"320\">\n<p align=\"left\">Result<\/p>\n<\/td>\n<td>\n<p align=\"left\"><u>Result<\/u>&lt;<u>Int<\/u>, <u>Error<\/u>>.<u>Publisher<\/u>  <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"320\" width=\"320\">\n<p align=\"left\">Future<\/p>\n<\/td>\n<td>\n<p align=\"left\"><u>Future<\/u>&lt;<u>Int<\/u>, <u>Never<\/u>><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"320\" width=\"320\">\n<p align=\"left\">PassthroughSubject<\/p>\n<\/td>\n<td>\n<p align=\"left\"><u>PassthroughSubject<\/u>&lt;<u>Int<\/u>, <u>Never<\/u>><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"320\" width=\"320\">\n<p align=\"left\">CurrentValueSubject<\/p>\n<\/td>\n<td>\n<p align=\"left\"><u>CurrentValueSubject<\/u>&lt;<u>Int<\/u>, <u>Never<\/u>><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0423 \u0432\u0441\u0435\u0445 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u0432 \u0441\u0432\u043e\u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438\u00a0\u0441 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0432 Data stream \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u0438 \u043d\u0430\u0434\u043e \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c84\/773\/75d\/c8477375dff45e8d874eb0cde712a468.png\" width=\"1920\" height=\"730\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c84\/773\/75d\/c8477375dff45e8d874eb0cde712a468.png\"\/><\/figure>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Combine \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u0442\u0438\u0440\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"swift\">let justPubliser = PassthroughSubject&lt;Int, Never>().eraseToAnyPublisher() let futurePublisher = Future&lt;Int, Never> { _ in }.eraseToAnyPublisher()<\/code><\/pre>\n<p>\u0412 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0443 \u043e\u0431\u043e\u0438\u0445 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 AnyPublisher&lt;Int, Never>, \u0447\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<h2>Empty<\/h2>\n<p>Empty \u2014 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439: <\/p>\n<pre><code class=\"swift\">let emptyPublisher = Empty&lt;Int, Error>()<\/code><\/pre>\n<p>\u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c guard, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0443 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438:<\/p>\n<pre><code class=\"swift\">func publish(value: Int?) -> AnyPublisher&lt;Int, Never> {     guard let value = value else {         return Empty(completeImmediately: true).eraseToAnyPublisher()     }     let subject = CurrentValueSubject&lt;Int, Never>(value)     return subject.eraseToAnyPublisher() }<\/code><\/pre>\n<h2>\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0438<\/h2>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u0432. \u041e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b 4 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438:<\/p>\n<pre><code class=\"swift\">func sink(receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable  func sink(receiveCompletion: @escaping ((Subscribers.Completion&lt;Self.Failure>) -> Void), receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable  func assign&lt;Root>(to keyPath: ReferenceWritableKeyPath&lt;Root, Self.Output>, on object: Root) -> AnyCancellable  func assign(to published: inout Published&lt;Self.Output>.Publisher<\/code><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Sink. \u041f\u0435\u0440\u0432\u044b\u0439 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f), \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0444\u0435\u0439\u043b\u0438\u0442\u044c\u0441\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f <code>Failure == Never<\/code>.\u00a0\u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043b\u0438\u0448\u0435\u043d \u043f\u0440\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0441 \u0442\u0438\u043f\u043e\u043c  <code>Failure == Error<\/code>, \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a71\/674\/17c\/a7167417cf0b46f22b5c9af7027a55b7.png\" width=\"1920\" height=\"692\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a71\/674\/17c\/a7167417cf0b46f22b5c9af7027a55b7.png\"\/><\/figure>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430\u043c\u0438: \u0438 \u0441 \u0442\u0435\u043c\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043a\u0438 <code>Failure == Never<\/code> \u0438 \u0441 \u0442\u0435\u043c\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445\u00a0<code>Failure == Error<\/code>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1d\/3cb\/7cb\/b1d3cb7cbc4169f2e6b9a39422153bbd.png\" width=\"1920\" height=\"692\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b1d\/3cb\/7cb\/b1d3cb7cbc4169f2e6b9a39422153bbd.png\"\/><\/figure>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>Failure == Error<\/code> \u043e\u0442 \u043a\u043e\u043c\u043f\u043b\u0438\u0448\u0435\u043d-\u0431\u043b\u043e\u043a\u0430 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f, \u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>Failure == Never<\/code> \u043e\u043d \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d, \u043d\u043e \u0435\u0433\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0438 \u0441\u0430\u043c \u0444\u0430\u043a\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443 \u043a\u043e\u043c\u043f\u043b\u0438\u0448\u0435\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0435\u0439\u0441\u0430 fail, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e finished:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1c\/1f8\/acd\/b1c1f8acd39ce9f762958576a38b443d.png\" width=\"1920\" height=\"692\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b1c\/1f8\/acd\/b1c1f8acd39ce9f762958576a38b443d.png\"\/><\/figure>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0431\u043b\u043e\u043a\u043e\u043c <strong>recieveCompletion<\/strong> \u2014 \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u043e\u043d \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430:<\/p>\n<ol>\n<li>\n<p>\u0412\u0438\u0434 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 one-shot (\u0433\u0435\u043d\u0435\u0440\u0438\u0442 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u0435\u0442). <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u043a\u0430\u043a \u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 [1, 2, 3].publisher).<\/p>\n<\/li>\n<li>\n<p>\u042f\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 .send(completion:), \u043d\u043e \u043e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 subject.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430 \u0441 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u044b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438.\u00a0\u0418 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u00a0\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u0441\u0430\u043c \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434: <\/p>\n<pre><code class=\"swift\">    .handleEvents(         receiveSubscription: { subscription in },         receiveOutput: { value in },         receiveCompletion: { completion in },         receiveCancel: { },         receiveRequest: { demand in             print(demand == .unlimited)             print(demand == .max(4))             print(demand == .none)         }     )<\/code><\/pre>\n<p>\u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c\u0438. \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <strong>assign<\/strong>:<\/p>\n<pre><code class=\"swift\">func assign&lt;Root>(to keyPath: ReferenceWritableKeyPath&lt;Root, Self.Output>, on object: Root) -> AnyCancellable<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 assign \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p><strong>keyPath<\/strong>\u00a0\u2014 \u044d\u0442\u043e \u043f\u0443\u0442\u044c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u00ab\u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f\u00bb \u0434\u043e \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u0430\u043b\u0435\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0432 \u044f\u0440\u043b\u044b\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e .assign() \u0438\u00a0\u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438\u00a0\u0441\u0440\u0430\u0437\u0443 \u043d\u0438\u0436\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 .sink().<\/p>\n<pre><code class=\"swift\">final class Controller: UIViewController {      private let publisher = PassthroughSubject&lt;String?, Never>()     private var bag = Set&lt;AnyCancellable>()     private let label = UILabel()      override func viewDidLoad() {         super.viewDidLoad()          publisher             .assign(to: \\.text, on: self.label)             .store(in: &amp;bag)          publisher             .sink { [weak self] value in                 self?.label.text = value             }             .store(in: &amp;bag)     } }<\/code><\/pre>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c\u00a0\u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u043e\u0442\u043b\u0438\u0447\u0438\u0439:<\/p>\n<p><strong>\u041f\u043b\u044e\u0441\u00a0assign:<\/strong><\/p>\n<ol>\n<li>\n<p>\u041b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u0435\u0435 \u2014 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041c\u0438\u043d\u0443\u0441\u044b assign:<\/strong><\/p>\n<ol>\n<li>\n<p>\u0421\u043b\u043e\u0436\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 <code>\\.keyPath<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423 <code>keyPath<\/code> \u043d\u0435\u0442 \u0430\u0432\u0442\u043e\u043a\u043e\u043c\u043f\u043b\u0438\u0442\u0430 \u2014 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c. \u0422\u043e\u0447\u043d\u0435\u0435, \u0430\u0432\u0442\u043e\u043a\u043e\u043c\u043f\u043b\u0438\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0443 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 \u0442\u0438\u043f <code>Failure == Never, .sink()<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0441 Never,\u00a0\u0438 \u0441 Error.<\/p>\n<\/li>\n<li>\n<p>\u0412 <code>.sink()<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0443 <em>\u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/em>\u00a0<code>.assign(to: on: object)<\/code>\u00a0\u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 .assign(to: on: <em>self<\/em>), \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0443 <code>.sink()<\/code> \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u0438\u0441\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u00a0\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0435\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Combine \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.swiftbysundell.com\/articles\/combine-self-cancellable-memory-management\/\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<p>\u00a0\u0412\u0442\u043e\u0440\u044b\u043c, \u043c\u0435\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c <code>.assign()<\/code>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>.assign(to: )<\/code><\/p>\n<pre><code class=\"swift\">func assign(to published: inout Published&lt;Self.Output>.Publisher)<\/code><\/pre>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a <code>.assign(to: )<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0441 iOS 14 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0443 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430 <code>Error == Never<\/code>.<\/p>\n<p>\u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b\u043c\u0438 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>@Publised<\/code>. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 AnyCancellable, \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c PassthroughSubject \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0415\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0435\u0440\u0435\u0434 <code>.assign(to: on:)<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0438\u0441\u043a\u043e\u0432 \u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0435 \u043d\u0430\u0434\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>.store(in:)<\/code><\/p>\n<pre><code class=\"swift\">final class MyModel: ObservableObject {     @Published var lastUpdated: Date = Date()     init() {          Timer.publish(every: 1.0, on: .main, in: .common)              .autoconnect()              .assign(to: &amp;$lastUpdated)     } }<\/code><\/pre>\n<h2>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b\u00a0<\/h2>\n<p>\u0412 Combine \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043f\u0430\u0440\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/combine\/publishers-merge-publisher-operators\"><u>\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043e\u0442 Apple<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tanaschita.com\/20221121-cheatsheet-combine-operators\/\"><u>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441 \u0448\u0430\u0440\u0438\u043a\u043e\u0432\u044b\u043c\u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438<\/u><\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u043c \u0431\u044b \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u043c \u043d\u0435 \u0431\u044b\u043b Combine, \u0432\u0441\u0435 \u0436\u0435 \u0435\u0441\u0442\u044c \u043b\u043e\u0436\u043a\u0430 \u0434\u0435\u0433\u0442\u044f \u0432 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0431\u043e\u0447\u043a\u0435 \u043c\u0435\u0434\u0430 \u2014 \u0434\u0435\u0431\u0430\u0433 \u0438 \u043f\u043e\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>\u0417\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 assing) \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043a\u0443\u0434\u0430 \u0432\u043e\u0442\u043a\u043d\u0443\u0442\u044c \u0431\u0440\u0435\u0439\u043a\u043f\u043e\u0438\u043d\u0442. \u0422\u0430\u043a\u0436\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0430\u0443\u0442\u043f\u0443\u0442.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e Apple \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432:<\/p>\n<ol>\n<li>\n<p><strong>.handleEvents()<\/strong> \u2014 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0443\u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0432\u044b\u0448\u0435. \u0425\u043e\u0442\u044f \u044d\u0442\u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0430 \u043d\u0435 \u0434\u043b\u044f \u0434\u0435\u0431\u0430\u0433\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>.<strong>print()<\/strong> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u043e\u0433\u0438 \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>.breakpointOnError()<\/strong>\u00a0\u2014\u00a0\u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0440\u0435\u0439\u043a\u043f\u043e\u0438\u043d\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>.breakpoint()<\/strong>\u00a0\u2014 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u043b\u0438 \u0441 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u043d\u0430\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044e.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u0435\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438, \u043e\u0442\u043a\u0443\u0434\u0430 \u0435\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0436\u0434\u0435\u0448\u044c. \u0415\u0441\u043b\u0438 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, SwifLint), Xcode \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d\u0430 \u0435\u0441\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435.\u00a0\u041d\u0430 \u043c\u043e\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043b\u0438\u043d\u0442\u0435\u0440 \u0440\u0443\u0433\u0430\u043b\u0441\u044f \u043d\u0430 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443 <code>guard let self = self else { return }<\/code> \u0438 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043c\u0435\u043d\u044f \u0443\u0431\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u2014 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>Array(seq)<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>seq.map { $0 }.<\/code><\/p>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u0430\u0448\u043b\u0430\u0441\u044c \u0432 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 (\u0445\u043e\u0442\u044c \u0438 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0444\u0430\u0439\u043b\u0435). \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0435\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>.map { $0 }<\/code>, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b Combine \u0438 \u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>Combine \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u043e\u0432\u044b\u0439, \u043d\u043e \u0443\u0436\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u044e (\u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u044e) \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u043c, \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435.\u00a0<\/p>\n<p>\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043b\u0438\u0448\u0435\u043d \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u0440\u0438\u0442\u044c\u0441\u044f \u043c\u0438\u0437\u0438\u043d\u0447\u0438\u043a\u043e\u043c.<\/p>\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043f\u0430\u0440\u043e\u0439 \u0441\u0441\u044b\u043b\u043e\u043a \u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043e\u0434 \u043d\u0430 Combine \u0435\u0449\u0435 \u0447\u0438\u0449\u0435 \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/gist.github.com\/ollieatkinson\/4bb17450e2cc582132448f0b1ddec58a\">https:\/\/gist.github.com\/ollieatkinson\/4bb17450e2cc582132448f0b1ddec58a<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.swiftbysundell.com\/articles\/extending-combine-with-convenience-apis\/\">https:\/\/www.swiftbysundell.com\/articles\/extending-combine-with-convenience-apis\/<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u00a0<strong>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/strong><\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f mobile-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0446\u0441\u0435\u0442\u044f\u0445 \u2013\u00a0<\/strong><a href=\"https:\/\/vk.com\/simbirsoft\"><strong><u>\u0412\u041a<\/u><\/strong><\/a><strong>\u00a0\u0438\u00a0<\/strong><a href=\"https:\/\/t.me\/+pK7Kj9d-JfNjZjA6\"><strong><u>Telegram<\/u><\/strong><\/a><strong>.<\/strong><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/731918\/\"> https:\/\/habr.com\/ru\/articles\/731918\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0421\u0435\u0440\u0433\u0435\u0439, iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 SimbirSoft.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/company\/simbirsoft\/blog\/712332\/\"><u>\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/u><\/a>\u00a0\u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Combine \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0441 RxSwift. <\/p>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Combine\u00a0\u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u2014 \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u0435\u0448\u0435\u0432\u043b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0434\u043d\u044b\u043c. \u0415\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u2014 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0441\u043e\u0438\u0441\u043a\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>Combine \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0435\u0433\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 SwiftUI).<\/p>\n<\/li>\n<\/ol>\n<p>\u00a0\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u0438\u0434\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Combine, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h2>\u041f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b<\/h2>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u0432, \u0442\u043e \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a \u043d\u0438\u043c, \u043d\u043e \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0431\u0435\u0440\u0435\u0433\u0443.<\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>@Published<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b \u2014 <strong>NotificationCenter<\/strong>, <strong>URLSession<\/strong>, <strong>Timer<\/strong>.<\/p>\n<p>\u0427\u0435\u043c \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>@Published<\/code>? \u0422\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 SwiftUI, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438. \u0414\u0430 \u0438 \u043c\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430\u043c\u0438? NotificationCenter \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442, \u0438 \u043e \u043d\u0435\u043c \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0435\u0447\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c. URLSession \u043b\u0438\u0431\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0447\u043a\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043b\u0438\u0431\u043e\u00a0 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438. Timer \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0434\u043a\u0438\u0445 \u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0430\u0441 \u0431\u0435\u0437 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0439\u0434\u0443\u0441\u044c \u043f\u043e \u043d\u0430\u0448\u0438\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043c \u043d\u043e\u043d \u0433\u0440\u0430\u0442\u0430.<\/p>\n<p><strong>@Published<\/strong> \u2014 \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 SwiftUI, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043b\u043e\u0445\u043e \u0434\u0440\u0443\u0436\u0438\u0442 \u0441 UIKit-\u043e\u043c. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb \u043a\u0430\u043a willSet, \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0438\u0441\u043a, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u044f\u0442\u0441\u044f \u043d\u0430 UI, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c (\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438\u00a0\u0432 <a href=\"https:\/\/developer.apple.com\/documentation\/combine\/published\"><u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Apple<\/u><\/a>). \u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.swiftbysundell.com\/articles\/published-properties-in-swift\/\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<p><strong>NotificationCenter<\/strong> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0430\u043a \u043f\u0440\u043e\u0431\u043a\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u0421 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043b\u043e\u0432\u0438\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e\u00a0\u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043b\u0438\u0448\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439, \u043b\u0438\u0431\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.\u00a0\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043c\u0435\u043d\u044b \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.\u00a0<\/p>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">    private func addOldObserverForNotification() {         NotificationCenter.default             .addObserver(                 self,                 selector: #selector(catchNotification),                 name: UIApplication.didEnterBackgroundNotification,                 object: nil             )     }      @objc     private func catchNotification() {         print(\"catched old notification\")     }<\/code><\/pre>\n<p>\u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">    private var bag = Set&lt;AnyCancellable>()     private func subscribeForNotification() {         NotificationCenter.default             .publisher(for: UIApplication.didEnterBackgroundNotification)             .sink { notification in                 print(notification.name.rawValue)             }             .store(in: &amp;bag)     }<\/code><\/pre>\n<p><strong>\u0412 \u0447\u0435\u043c \u043f\u043b\u044e\u0441\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434 \u0441\u0442\u0430\u0440\u044b\u043c?<\/strong><\/p>\n<ol>\n<li>\n<p>\u0423\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441. \u0415\u0441\u043b\u0438 Combine \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c \u0438 \u043b\u0435\u0433\u043a\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0445\u043e\u0434\u044f\u0442 \u043b\u0435\u0433\u0430\u0441\u0438 Objective-C \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b, \u0430 \u0441 \u043d\u0438\u043c\u0438 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<p><strong>URLSession<\/strong> \u2014 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\u00a0\u0415\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0434\u0443\u0440\u0430\u043a\u0430\u00bb. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435\u00a0\u043b\u0438\u0431\u043e \u0432 \u0431\u044d\u043a\u0433\u0440\u0430\u0443\u043d\u0434\u0435\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>.subscribe(on: _)<\/code>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>.subscribe(on: DispatchQueue.main)<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d:<\/p>\n<pre><code class=\"swift\">    private func fetchData(from url: URL) -> AnyPublisher&lt;[String], Never> {         URLSession.shared.dataTaskPublisher(for: url)             .map { $0.data }             .decode(type: [String].self, decoder: JSONDecoder())             .replaceError(with: [])             .subscribe(on: DispatchQueue.main)             .receive(on: DispatchQueue.main)             .eraseToAnyPublisher()     }<\/code><\/pre>\n<p><strong>Timer<\/strong> \u2014 \u0442\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u043f\u043e\u0447\u0442\u0443 \u044e\u0437\u0435\u0440\u0430, \u043d\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u043c\u0438\u0442\u044c.<\/p>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in } RunLoop.main.add(timer, forMode: .default) timer.invalidate()<\/code><\/pre>\n<p>\u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"swift\">let timer = Timer.publish(every: 1, on: .main, in: .default)<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 NotificationCenter\u00a0\u0442\u0430\u0439\u043c\u0435\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u043b\u043e\u0436\u0443\u0440\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0435\u0435.<\/p>\n<p>\u0415\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430. Timer Publisher \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u00a0\u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:\u00a0\u043b\u0438\u0431\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>timer.connect()<\/code> \u0434\u043b\u044f \u043c\u0430\u043d\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u044e\u0437\u0435\u0440\u043e\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\u00bb), \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>timer.autoconnect()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0442\u0430\u0439\u043c\u0435\u0440, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041c\u0430\u043d\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/strong>  <\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>timer<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .sink { secondsLeft in<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print(secondsLeft)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 }<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .store(in: &amp;bag)<\/code><\/p>\n<p align=\"left\"><code>timer.connect()<\/code><\/p>\n<\/td>\n<td>\n<p><code>timer<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .autoconnect()<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 .sink { secondsLeft in<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print(secondsLeft)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 }<\/code><\/p>\n<p align=\"left\"><code>\u00a0\u00a0\u00a0 .store(in: &amp;bag)<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0440\u0443\u0447\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code>.invaidate())<\/code>.<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u043d\u043e\u0432\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043c\u0435\u043d\u0438\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u041c\u0435\u0442\u043e\u0434 <code>.sink()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c AnyCancellable \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u0435\u0440\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0438\u0440\u0430\u0435\u0442 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430.<\/p>\n<p>\u0423 AnyCancellable \u0435\u0441\u0442\u044c 2 \u043c\u0435\u0442\u043e\u0434\u0430: <\/p>\n<p><strong>.cancel()<\/strong> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e AnyCancellable \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0434\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<p><strong>.store(in:)<\/strong>\u00a0\u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\u00a0<\/p>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b \u0432 Combine<\/h2>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2014 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438\u00a0\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0438\u0445 \u0434\u0435\u043b\u0438\u043c.<\/p>\n<p><strong>\u041f\u043e \u044d\u043c\u0438\u0442\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439:<\/strong><\/p>\n<ol>\n<li>\n<p>One-shot \u2014\u00a0\u043e\u0442\u0434\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e 1 \u0440\u0430\u0437 \u0438 \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u044e\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0421ontinuous broadcasting \u2014\u00a0\u043e\u0442\u0434\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u043e \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443:<\/strong><\/p>\n<ol>\n<li>\n<p>Hot \u2014 \u044d\u0433\u043e\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u044b. \u0418\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0435\u0441\u0442\u044c \u0443 \u043d\u0438\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0435\u0441\u0442\u044c, \u043e\u043d\u0438 \u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u00ab\u043d\u0430 \u0442\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435\u00bb \u043d\u0435\u043a\u043e\u043c\u0443 \u0441\u043b\u0443\u0448\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>Cold \u2014 \u0431\u0443\u0434\u0443\u0442 \u0441\u043c\u0438\u0440\u0435\u043d\u043d\u043e \u0436\u0434\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u043d\u0430 \u043d\u0438\u0445 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442\u0441\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u043e \u0442\u0438\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0445:<\/strong><\/p>\n<ol>\n<li>\n<p>Just (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Empty (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Optional (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Result (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p>Future (one-shot, hot)<\/p>\n<\/li>\n<li>\n<p>Sequence (cb, cold)<\/p>\n<\/li>\n<li>\n<p>Subject (cb, hot) \u2014 PassthroughSubject, CurrentValueSubject<\/p>\n<\/li>\n<li>\n<p>NotificationCenter (cb, hot)<\/p>\n<\/li>\n<li>\n<p>URLSession (one-shot, cold)<\/p>\n<\/li>\n<li>\n<p> Timer (cb, hot\/cold)<\/p>\n<\/li>\n<li>\n<p> \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Publisher<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u043e\u0432, \u043d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043a\u043e\u0434\u0443, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a <code>.sink<\/code>:<\/p>\n<p><strong>completion<\/strong>\u00a0\u2014 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0435\u0442.<\/p>\n<p><strong>value<\/strong>\u00a0\u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440\u0430.<\/p>\n<pre><code class=\"swift\">    .sink(         receiveCompletion: {             print(\"status: \\($0)\")         },         receiveValue: {             print(\"value: \\($0)\")         }     )<\/code><\/pre>\n<h2>Optional<\/h2>\n<p>Optional \u2014 \u044d\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u0435\u0442.<\/p>\n<p>\u0415\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <code>value == nil<\/code>, \u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0435\u0442, \u0430 \u0432 \u0431\u043b\u043e\u043a\u0435 recieveCompletion \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u00ab\u0432\u0441\u0451\u00bb. <\/p>\n<pre><code class=\"swift\">var intValue: Int? = nil let optionalPublisher: Optional&lt;Int>.Publisher = intValue.publisher  optionalPublisher     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"received value: \\(value)\")         }     )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">completion status: finished<\/code><\/pre>\n<p>\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e nil, \u0442\u043e \u0432 \u0431\u043b\u043e\u043a\u0435 receiveValue \u043e\u043d\u043e \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043e \u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 guard \u0438\u043b\u0438 if-let.<\/p>\n<pre><code class=\"swift\">var intValue: Int? = 10<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">received value: 10 completion status: finished<\/code><\/pre>\n<p><strong>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b<\/strong> \u2014 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0435\u0434\u043a\u0438\u0439 \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Just.<\/p>\n<h2>Just<\/h2>\n<p><strong>Just <\/strong>\u2014 \u044d\u0442\u043e \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043c\u043e\u043b\u043a\u0430\u0435\u0442.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 Data stream:<\/p>\n<pre><code class=\"swift\">let stringPublisher: Just&lt;String> = Just(\"?\")  stringPublisher     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"received value: \\(value)\")         }     )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">received value: ? completion status: finished<\/code><\/pre>\n<p>\u0423 Just \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u0430). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 output \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 String, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u0434 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"swift\">let stringPublisher: Just&lt;String?> = Just(nil)  stringPublisher     .sink(         receiveCompletion: { completion in             print(\"completion status: \\(completion)\")         }, receiveValue: { value in             print(\"recieved value: \\(value)\")         }     )<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"swift\">recieved value: nil completion status: finished<\/code><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e Just \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e\u00a0\u0435\u0433\u043e \u0442\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438 \u2014 Never, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u043a\u0430\u0436\u0435\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438\u0434\u0435\u0442 nil, \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u0438 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 Output \u0438 Error, \u043f\u0430\u0431\u043b\u0438\u0448\u0435\u0440<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-408707","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/408707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=408707"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/408707\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=408707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=408707"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=408707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}