{"id":12025,"date":"2020-02-27T15:20:05","date_gmt":"2020-02-27T15:20:05","guid":{"rendered":"https:\/\/bestkora.com\/IosDeveloper\/?p=12025"},"modified":"2020-03-03T07:55:35","modified_gmt":"2020-03-03T07:55:35","slug":"sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news","status":"publish","type":"post","link":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/","title":{"rendered":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News."},"content":{"rendered":"<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12104 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50.png\" alt=\"\" width=\"2006\" height=\"1356\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50.png 2006w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-300x203.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-768x519.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-1024x692.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-444x300.png 444w\" sizes=\"auto, (max-width: 2006px) 100vw, 2006px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u0447\u0435\u0439 <code>API<\/code> \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0430\u0439\u0442\u043e\u043c, \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0438 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u043d\u0438\u043c \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b, \u0442\u043e \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e.<a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-25-at-16.04.16.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12029 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-25-at-16.04.16.png\" alt=\"\" width=\"1420\" height=\"836\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-25-at-16.04.16.png 1420w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-25-at-16.04.16-300x177.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-25-at-16.04.16-768x452.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-25-at-16.04.16-1024x603.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-25-at-16.04.16-500x294.png 500w\" sizes=\"auto, (max-width: 1420px) 100vw, 1420px\" \/><\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445<\/span><span style=\"font-weight: 400;\">\u00a0\u00a0\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <a href=\"https:\/\/bestkora.com\/IosDeveloper\/modern-networking-in-swift-5-with-urlsession-combine-and-codable\/\">\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u043b\u044c\u043c\u043e\u0432\u00a0<\/a><a href=\"https:\/\/developers.themoviedb.org\/3\/getting-started\/introduction\">TMDb<\/a>\u00a0\u0438<a href=\"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-urlsession-combine-i-codable-chast-2\/\"> \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439<\/a>\u00a0<a href=\"https:\/\/newsapi.org\/\">NewsAPI.org<\/a>\u00a0\u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u00a0<code>Combine<\/code> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>HTTP<\/code> \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\u00a0\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0445 \u0432\u043e\u00a0<code>View Model<\/code>\u00a0\u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>UI<\/code>, \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>SwiftUI<\/code>.\u00a0\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043c \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 &#171;\u0432\u043d\u0435\u0448\u043d\u0438\u043c&#187; \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u043c\u00a0<code><span style=\"color: #0000ff;\">Timer<\/span><\/code> \u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u0435\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0\u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u0447\u0435\u043c \u0432 \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u043c \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0435\u00a0<a href=\"https:\/\/newsapi.org\/\">NewsAPI.org<\/a>, \u043d\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>Combine<\/code>, \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.\u00a0\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">Timer<\/span><\/code> \u0432 <code>View Model<\/code> \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>UI<\/code> \u0432 <code>SwiftUI<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043d\u043e\u0432\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 (<code>Story<\/code>), \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u044d\u0442\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0435.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><code>API<\/code>\u00a0\u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u042d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043a\u043e\u0434\u043e\u043c \u0431\u0435\u0437 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 <code>public APIs<\/code>.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041d\u0430\u0448\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Combine<\/code> \u00ab\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439\u00bb\u00a0<code><span style=\"color: #0000ff;\">Publisher<\/span><\/code>\u00a0\u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u00ab\u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0441\u044f\u00bb \u0432\u00a0<code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code> \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u0441\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445\u00a0<code>SwiftUI<\/code> \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u0418 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e &#171;\u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442&#187; \u0441\u0432\u043e\u0438\u00a0<code><span style=\"color: #0000ff;\">View<\/span><\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0412 \u044d\u0442\u0438\u00a0<code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code> \u043a\u043b\u0430\u0441\u0441\u044b \u043c\u044b \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445\u00a0\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043b\u0438\u0431\u043e \u0442\u0430\u043a\u0438\u043c\u0438 &#171;\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438&#187; \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (<code>UI<\/code>) \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f <code><span style=\"color: #0000ff;\">TextField<\/span><\/code>, <code><span style=\"color: #0000ff;\">Picker<\/span><\/code>, <code><span style=\"color: #0000ff;\">Stepper<\/span><\/code>, <code><span style=\"color: #0000ff;\">Toggle<\/span><\/code>\u00a0, \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043d\u0435\u0448\u043d\u0438\u0445 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187; \u0442\u0438\u043f\u0430\u00a0<code><span style=\"color: #0000ff;\">Timer<\/span><\/code>, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435\u00a0<code><span style=\"color: #0000ff;\">@Published <\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c &#171;\u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u043c\u0438&#187;, \u044f\u0432\u043b\u044f\u044f\u0441\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0438\/ \u0438\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 &#171;\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445&#187;\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u0442\u043e \u043d\u0430\u0441 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u00a0&#171;\u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445&#187;\u00a0\u043e\u0442 &#171;\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445&#187;\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Combine<\/code>\u00a0\u0432\u00a0<code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code> \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435\u00a0 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 \u0440\u043e\u043b\u0438\u00a0<code>View Model<\/code>\u00a0\u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>UI<\/code> \u0432 <code>SwiftUI<\/code>.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u0418 \u0431\u0435\u0437 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044e&#187;\u00a0<code><span style=\"color: #0000ff;\">Timer<\/span><\/code>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c, <code>UI <\/code>\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d: \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 &#171;\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a&#187; (<code>images<\/code>), \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0439. \u0417\u0430\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0435 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f. \u041f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <code>UI<\/code> \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c.<br \/>\n<\/span><\/p>\n<p><!--more--><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.51.54.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12105 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.51.54.png\" alt=\"\" width=\"1498\" height=\"1372\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.51.54.png 1498w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.51.54-300x275.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.51.54-768x703.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.51.54-1024x938.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.51.54-328x300.png 328w\" sizes=\"auto, (max-width: 1498px) 100vw, 1498px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0421\u043f\u0443\u0441\u0442\u044f 4 \u043c\u0438\u043d\u0443\u0442 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u044d\u043a\u0440\u0430\u043d:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.54.53.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12106 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.54.53.png\" alt=\"\" width=\"1522\" height=\"1378\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.54.53.png 1522w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.54.53-300x272.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.54.53-768x695.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.54.53-1024x927.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.54.53-331x300.png 331w\" sizes=\"auto, (max-width: 1522px) 100vw, 1522px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/BestKora\/HackerNewsApp\"><strong>Github<\/strong><\/a>.<\/span><\/p>\n<h1>\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 API \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>.<\/h1>\n<p><span style=\"font-weight: 400;\">\u0421\u0435\u0440\u0432\u0438\u0441\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445, \u0442\u043e\u043f\u043e\u0432\u044b\u0445, \u0441\u0430\u043c\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u0445 <code><span style=\"color: #0000ff;\">[Story]<\/span><\/code> \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code>\u00a0 \u043f\u043e \u0435\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443\u00a0<code><span style=\"color: #0000ff;\">id<\/span><\/code>. \u041d\u0430\u0448\u0430 \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439,\u00a0\u043e\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 Story<em>.swift<\/em>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">import Foundation\r\n\r\nstruct Story: Codable, Identifiable {\r\n  let id: Int\r\n  let title: String\r\n  let by: String\r\n  let time: TimeInterval\r\n  let url: String\r\n}<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u0418\u0441\u0442\u043e\u0440\u0438\u044f\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code>\u00a0\u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code><span style=\"color: #0000ff;\">id<\/span><\/code>, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <code><span style=\"color: #0000ff;\">title<\/span><\/code>, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u00a0<code><span style=\"color: #0000ff;\">description<\/span><\/code>, \u0430\u0432\u0442\u043e\u0440\u0430 <code><span style=\"color: #0000ff;\">by<\/span><\/code>, \u0434\u0430\u0442\u0443 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 <code><span style=\"color: #0000ff;\">time<\/span><\/code> \u0438\u00a0<code>URL<\/code>\u00a0\u0438\u0441\u0442\u043e\u0440\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">url<\/span><\/code>.\u00a0\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code><span style=\"color: #0000ff;\">Story<\/span><\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code><span style=\"color: #0000ff;\">Codable<\/span><\/code>, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043a\u043e\u0434\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00a0<code>JSON<\/code> \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u041c\u043e\u0434\u0435\u043b\u044c. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code>\u00a0\u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0435\u0449\u0435 \u0438 <code><span style=\"color: #0000ff;\">Identifiable<\/span><\/code>, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">[Story]<\/span><\/code> \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430\u00a0<code><span style=\"color: #0000ff;\">List<\/span><\/code>\u00a0\u0432 <code>SwiftUI<\/code>. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b <code><span style=\"color: #0000ff;\">Identifiable<\/span><\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f\u00a0<code><span style=\"color: #0000ff;\">Hashable<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code><span style=\"color: #0000ff;\">id<\/span><\/code>,\u00a0<\/span><span style=\"font-weight: 400;\">\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u043e\u0442 \u043d\u0430\u0441 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d\u00a0<code>API<\/code> \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0, \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0435\u0433\u043e \u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<em>NewsAPI.swift<\/em>. \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043d\u0430\u0448\u0435\u0433\u043e <code>API<\/code>\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0\u043a\u043b\u0430\u0441\u0441 <code><span style=\"color: #0000ff;\">NewsAPI<\/span><\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0&#8212; \u0438\u0441\u0442\u043e\u0440\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code>\u00a0\u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c\u00a0<code><span style=\"color: #0000ff;\">id<\/span><\/code> \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u043d\u0430\u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">[Story]<\/span><\/code>\u00a0\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e\u00a0<code><span style=\"color: #0000ff;\">endpoint <\/span><\/code>:\u00a0<\/span><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\"><code><span style=\"color: #0000ff;\">story (id: Int) -&gt; AnyPublisher&lt;Story, Never&gt;<\/span><\/code> &#8212;\u00a0\u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code>\u00a0\u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c\u00a0<code><span style=\"color: #0000ff;\">id<\/span><\/code>,<\/span><\/li>\n<li><span style=\"font-weight: 400;\"><code><span style=\"color: #0000ff;\">stories (from endpoint: Endpoint)\u00a0-&gt; AnyPublisher&lt;[Story], Never&gt;<\/span><\/code> &#8212; \u0432\u044b\u0431\u043e\u0440\u043a\u0430\u00a0 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">[Story]<\/span><\/code>\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code><span style=\"color: #0000ff;\">endpoint<\/span><\/code>.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435\u00a0\u043d\u043e\u0432\u043e\u0433\u043e\u00a0 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u00a0<code><span style=\"color: #0000ff;\">Combine<\/span><\/code> \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u00a0\u0438\u0441\u0442\u043e\u0440\u0438\u044e\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code> \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">[Story]<\/span><\/code>, \u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187;\u00a0<code><span style=\"color: #0000ff;\">Publisher<\/span><\/code>.\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">\u041e\u0431\u0430 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 &#8212; <code><span style=\"color: #0000ff;\">Never<\/span><\/code>, \u0430 \u0435\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438\u043b\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0438\u043c\u0435\u043b\u0430 \u043c\u0435\u0441\u0442\u043e, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">[Story]()<\/span><\/code>\u00a0\u0438\u043b\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c&#187;\u00a0<code><span style=\"color: #0000ff;\">Empty<\/span><\/code>\u00a0\u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0441\u0442\u044b\u043c\u0438.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0422\u043e, \u043a\u0430\u043a\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u0431\u0443\u0434\u0435\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u00a0<code><span style=\"color: #0000ff;\">enum Endpoint<\/span><\/code>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">enum Endpoint {\r\n  static let baseURL = \r\n                 URL(string: \"https:\/\/hacker-news.firebaseio.com\/v0\/\")!\r\n  \r\n  case newstories, topstories, beststories\r\n  case story(Int)\r\n  \r\n  var url: URL {\r\n    switch self {\r\n    case .newstories:\r\n      return Endpoint.baseURL.appendingPathComponent(\"newstories.json\")\r\n    case .topstories:\r\n      return Endpoint.baseURL.appendingPathComponent(\"topstories.json\")\r\n    case .beststories:\r\n      return Endpoint.baseURL.appendingPathComponent(\"beststories.json\")\r\n    case .story(let id):\r\n      return Endpoint.baseURL.appendingPathComponent(\"item\/\\(id).json\")\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u042d\u0442\u043e :<\/span><\/p>\n<ul>\n<li><span style=\"font-weight: 400;\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438\u00a0<code><span style=\"color: #0000ff;\">.newstories<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 1-2 \u043c\u0438\u043d\u0443\u0442\u044b,<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438\u00a0\u00a0<code><span style=\"color: #0000ff;\">.topstories<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0435 1-2 \u0447\u0430\u0441\u0430,<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u0441\u0430\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438\u00a0<code><span style=\"color: #0000ff;\">.beststories<\/span><\/code>\u00a0\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u0434\u0435\u043d\u044c,<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u00a0<code><span style=\"color: #0000ff;\">.story(Int)<\/span><\/code> \u0441\u00a0\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c\u00a0<code><span style=\"color: #0000ff;\">id<\/span><\/code>\u00a0.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e\u0439 \u043d\u0430\u043c \u043e\u043f\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code><span style=\"color: #0000ff;\">Endpoint<\/span><\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 <code><span style=\"color: #0000ff;\">init?<\/span><\/code> \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 :<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">init? (index: Int) {\r\n           switch index {\r\n           case 0: self = .newstories\r\n           case 1: self = .topstories\r\n           case 2: self = .beststories\r\n           default: return nil\r\n           }\r\n       }<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <code><span style=\"color: #0000ff;\">NewsAPI<\/span><\/code>\u00a0\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u00a0<code><span style=\"color: #0000ff;\">story (id: Int) -&gt; AnyPublisher&lt;Story, Never&gt;<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0435\u0451 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u00a0<code><span style=\"color: #0000ff;\">id<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-11.33.02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12052 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-11.33.02.png\" alt=\"\" width=\"1108\" height=\"290\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-11.33.02.png 1108w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-11.33.02-300x79.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-11.33.02-768x201.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-11.33.02-1024x268.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-11.33.02-500x131.png 500w\" sizes=\"auto, (max-width: 1108px) 100vw, 1108px\" \/><\/a><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\">\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code><span style=\"color: #0000ff;\">id<\/span><\/code>\u00a0\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c <code>URL<\/code> <code><span style=\"color: #0000ff;\">Endpoint.story(id).url<\/span><\/code>\u00a0\u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0443\u0436\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">dataTaskPublisher(for:)<\/span><\/code>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0442\u0435\u0436 <code><span style=\"color: #0000ff;\">(data: Data, response: URLResponse)<\/span><\/code>, \u0430\u00a0\u043e\u0448\u0438\u0431\u043a\u043e\u0439\u00a0&#8212;\u00a0<code><span style=\"color: #0000ff;\">URLError<\/span><\/code>,<br \/>\n<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <span style=\"color: #0000ff;\">map { }<\/span> \u0431\u0435\u0440\u0435\u043c \u0438\u0437 \u043a\u043e\u0440\u0442\u0435\u0436\u0430 <code><span style=\"color: #0000ff;\">(data: Data, response: URLResponse)<\/span><\/code> \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435\u00a0<code><span style=\"color: #0000ff;\">data<\/span><\/code>,\u00a0<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c <code>JSON<\/code> \u0434\u0430\u043d\u043d\u044b\u0435\u00a0<code><span style=\"color: #0000ff;\">data<\/span><\/code> \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u041c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code>,\u00a0<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0448\u0430\u0433\u0430\u0445 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">Empty<\/span><\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0<code><span style=\"color: #0000ff;\">catch {\u00a0 }<\/span><\/code>,<\/span><\/li>\n<li><span style=\"font-weight: 400;\">&#171;\u0441\u0442\u0438\u0440\u0430\u0435\u043c&#187; \u0422\u0418\u041f &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code><span style=\"color: #0000ff;\">eraseToAnyPublisher()<\/span><\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code><span style=\"color: #0000ff;\">AnyPublisher<\/span><\/code>.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\u0417\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">[Story]<\/span><\/code> \u0432\u043e\u0437\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u043e\u0434\u00a0<code><span style=\"color: #0000ff;\">stories (from endpoint: Endpoint)\u00a0-&gt; AnyPublisher&lt;[Story], Never&gt;<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043a\u0443\u0441\u043e\u0447\u043a\u043e\u0432.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"> \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0435, \u043d\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e <code>URL<\/code>\u00a0<code><span style=\"color: #0000ff;\">endpoint.url<\/span><\/code>, &#8230;<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.24.17.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12111 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.24.17.png\" alt=\"\" width=\"1124\" height=\"260\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.24.17.png 1124w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.24.17-300x69.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.24.17-768x178.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.24.17-1024x237.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.24.17-500x116.png 500w\" sizes=\"auto, (max-width: 1124px) 100vw, 1124px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">&#8230; \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b <code><span style=\"color: #0000ff;\">[Int]<\/span><\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c <code><span style=\"color: #0000ff;\">ids<\/span><\/code>\u00a0\u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 :<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-26-at-15.12.20.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12049 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-26-at-15.12.20.png\" alt=\"\" width=\"1466\" height=\"158\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-26-at-15.12.20.png 1466w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-26-at-15.12.20-300x32.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-26-at-15.12.20-768x83.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-26-at-15.12.20-1024x110.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-26-at-15.12.20-500x54.png 500w\" sizes=\"auto, (max-width: 1466px) 100vw, 1466px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 &#8212; 500.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u0438\u00a0 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">ids<\/span><\/code> \u0432 \u0441\u0430\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code><span style=\"color: #0000ff;\">mergedStories (ids:)<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">id <\/span><\/code>\u00a0&#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">AnyPublisher&lt;Story, Never&gt; <\/span><\/code> \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 :<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func mergedStories(ids storyIDs: [Int]) \r\n                                    -&gt; AnyPublisher&lt;Story, Never&gt;{\r\n.  .  .  .  .  .  .  .  .  .  .  .  .\r\n}<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u041f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443, \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code><span style=\"color: #0000ff;\">story(id:)<\/span><\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code><span style=\"color: #0000ff;\">ids<\/span><\/code> \u0438 \u0437\u0430\u0442\u0435\u043c &#171;\u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c&#187; (<code>flatten<\/code>) \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<br \/>\n\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 <code><span style=\"color: #0000ff;\">maxStories<\/span><\/code> <code><span style=\"color: #0000ff;\">ids<\/span><\/code> \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u00a0<code><span style=\"color: #0000ff;\">ids<\/span><\/code>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func mergedStories(ids storyIDs: [Int]) \r\n                                    -&gt; AnyPublisher&lt;Story, Never&gt;{\r\nlet storyIDs = Array(storyIDs.prefix(maxStories))\r\nprecondition(!storyIDs.isEmpty)\r\n.  .  .  .  .  .  .  .  .  .  .  .  .\r\n}<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code><span style=\"color: #0000ff;\">story(id:)<\/span><\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">initialPublisher<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e <code><span style=\"color: #0000ff;\">Story<\/span><\/code> \u0441 \u043f\u0435\u0440\u0432\u044b\u043c <code><span style=\"color: #0000ff;\">id<\/span><\/code> \u0432 \u0441\u043f\u0438\u0441\u043a\u0435\u00a0<code><span style=\"color: #0000ff;\">ids<\/span><\/code>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func mergedStories(ids storyIDs: [Int]) \r\n                                    -&gt; AnyPublisher&lt;Story, Never&gt;{\r\nlet storyIDs = Array(storyIDs.prefix(maxStories))\r\nprecondition(!storyIDs.isEmpty)\r\n\r\nlet initialPublisher = story(id: storyIDs[0])\r\nlet remainder = Array(storyIDs.dropFirst())\r\n.  .  .  .  .  .  .  .  .  .  .  .  .\r\n}<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code><span style=\"color: #0000ff;\">reduce(_:_:)<\/span><\/code> \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>Swift<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0434 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0438\u0441\u044f <code><span style=\"color: #0000ff;\">ids<\/span><\/code>, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c\u00a0<code><span style=\"color: #0000ff;\">id<\/span><\/code> \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044e&#187; <code><span style=\"color: #0000ff;\">initialPublisher<\/span><\/code>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func mergedStories(ids storyIDs: [Int]) \r\n                                -&gt; AnyPublisher&lt;Story, Never&gt; {\r\n    let storyIDs = Array(storyIDs.prefix(maxStories))\r\n    precondition(!storyIDs.isEmpty)\r\n\r\n    let initialPublisher = story(id: storyIDs[0])\r\n    let remainder = Array(storyIDs.dropFirst())\r\n    \r\n    return remainder.reduce(initialPublisher) {\r\n                (combined, id) -&gt; AnyPublisher&lt;Story, Never&gt; in\r\n        combined.merge(with: story(id: id))\r\n        .eraseToAnyPublisher()\r\n    }\r\n  }<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212; \u044d\u0442\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 &#171;\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442&#187; \u043a\u0430\u0436\u0434\u0443\u044e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code> \u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043c\u0435\u0442\u043e\u0434\u0443 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">stories (from endpoint: Endpoint)\u00a0-&gt; AnyPublisher&lt;[Story], Never&gt;<\/span><\/code>. \u041c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f\u00a0<code><span style=\"color: #0000ff;\">endpoint.url<\/span><\/code>\u00a0\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">ids<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u043e\u0434\u043d\u0443 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func stories(from endpoint: Endpoint) -&gt; AnyPublisher&lt;[Story], Never&gt; {\r\n    URLSession.shared.dataTaskPublisher(for: endpoint.url)\r\n      .map { $0.0 }\r\n      .decode(type: [Int].self, decoder: JSONDecoder())\r\n      .catch { _ in Empty() } \r\n      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .\r\n      .eraseToAnyPublisher()\r\n  }<\/code><code class=\"language-swift\"><\/code><code class=\"language-swift\"><\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">ids<\/span><\/code>\u00a0\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043c\u0435\u0442\u043e\u0434\u0430 <code><span style=\"color: #0000ff;\">mergedStories(ids:)<\/span><\/code> \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 <code><span style=\"color: #0000ff;\">precondition<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440:<br \/>\n<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func stories(from endpoint: Endpoint) -&gt; AnyPublisher&lt;[Story], Never&gt; {\r\n    URLSession.shared.dataTaskPublisher(for: endpoint.url)\r\n      .map { $0.0 }\r\n      .decode(type: [Int].self, decoder: JSONDecoder())\r\n      .catch { _ in Empty() }\r\n      .filter { !$0.isEmpty }  \r\n      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .\r\n      .eraseToAnyPublisher()\r\n  }<\/code><code class=\"language-swift\"><\/code><code class=\"language-swift\"><\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">storyIDs<\/span><\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code><span style=\"color: #0000ff;\">flatMap<\/span><\/code>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func stories(from endpoint: Endpoint) -&gt; AnyPublisher&lt;[Story], Never&gt; {\r\n    URLSession.shared.dataTaskPublisher(for: endpoint.url)\r\n      .map { $0.0 }\r\n      .decode(type: [Int].self, decoder: JSONDecoder())\r\n      .catch { _ in Empty() }\r\n      .filter { !$0.isEmpty }\r\n      .flatMap { storyIDs in self.mergedStories(ids: storyIDs)}  \r\n      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .\r\n      .eraseToAnyPublisher()\r\n  }<\/code><code class=\"language-swift\"><\/code><code class=\"language-swift\"><\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code><span style=\"color: #0000ff;\">Story<\/span><\/code>, \u043f\u0440\u0438\u0447\u0435\u043c \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430. \u041c\u044b \u0436\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u043c\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">[Story]<\/span><\/code>, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 <code><span style=\"color: #0000ff;\">View Controller<\/span><\/code> \u0438\u043b\u0438 \u0432 <code>SwiftUI<\/code> <code><span style=\"color: #0000ff;\">View<\/span><\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0430\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c <code><span style=\"color: #0000ff;\">collect<\/span><\/code>:<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func stories(from endpoint: Endpoint) -&gt; AnyPublisher&lt;[Story], Never&gt; {\r\n    URLSession.shared.dataTaskPublisher(for: endpoint.url)\r\n      .map { $0.0 }\r\n      .decode(type: [Int].self, decoder: JSONDecoder())\r\n      .catch { _ in Empty() }\r\n      .filter { !$0.isEmpty }\r\n      .flatMap { storyIDs in self.mergedStories(ids: storyIDs)}\r\n      .collect(maxStories)    \r\n      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .\r\n      .eraseToAnyPublisher()\r\n  }<\/code><code class=\"language-swift\"><\/code><code class=\"language-swift\"><\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443\u00a0<code><span style=\"color: #0000ff;\">id<\/span><\/code>, \u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u00a0<code><span style=\"color: #0000ff;\">sorted()<\/span><\/code>. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u00a0\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0\u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0430 \u043d\u043e\u0432\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438 \u043f\u043e\u0440\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c <code>UI<\/code>.<\/span><\/p>\n<pre class=\"line-numbers\"><code class=\"language-swift\">func stories(from endpoint: Endpoint) -&gt; AnyPublisher&lt;[Story], Never&gt; {\r\n    URLSession.shared.dataTaskPublisher(for: endpoint.url)\r\n      .map { $0.0 }\r\n      .decode(type: [Int].self, decoder: JSONDecoder())\r\n      .catch { _ in Empty() }\r\n      .filter { !$0.isEmpty }\r\n      .flatMap { storyIDs in self.mergedStories(ids: storyIDs)}\r\n      .collect(maxStories)\r\n      .map { stories in  stories.sorted (by: {$0.id &gt; $1.id})}    \r\n      .eraseToAnyPublisher()\r\n  }<\/code><code class=\"language-swift\"><\/code><code class=\"language-swift\"><\/code><\/pre>\n<p><span style=\"font-weight: 400;\">\u041a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c &#171;\u0441\u0442\u0438\u0440\u0430\u043d\u0438\u044f \u0422\u0418\u041f\u0410&#187; <code><span style=\"color: #0000ff;\">eraseToAnyPublisher()<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.31.47.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12112 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.31.47.png\" alt=\"\" width=\"1162\" height=\"424\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.31.47.png 1162w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.31.47-300x109.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.31.47-768x280.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.31.47-1024x374.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-19.31.47-500x182.png 500w\" sizes=\"auto, (max-width: 1162px) 100vw, 1162px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e\u00a0\u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <span style=\"color: #0000ff;\">NewAPI<\/span> \u0432\u0441\u0435 \u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 &#8212; <span style=\"color: #0000ff;\">story (id: Int)<\/span>, <span style=\"color: #0000ff;\">storyIDs (from endpoint: Endpoint)<\/span> \u0438 <span style=\"color: #0000ff;\">stories (from endpoint: Endpoint)<\/span> &#8212; \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0443\u044e \u043d\u0430\u043c \u043f\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u00a0<code>Generic<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e\u00a0&#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">AnyPublisher&lt;T, Never&gt;<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438\u00a0\u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e\u00a0<code><span style=\"color: #0000ff;\">url<\/span><\/code> \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u00a0<code>JSON<\/code> \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0451 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 <code><span style=\"color: #0000ff;\">Codable<\/span><\/code> \u041c\u043e\u0434\u0435\u043b\u0438 <code><span style=\"color: #0000ff;\">T<\/span><\/code>\u00a0:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-01-31-at-20.10.33.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11855 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-01-31-at-20.10.33.png\" alt=\"\" width=\"1202\" height=\"308\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-01-31-at-20.10.33.png 1202w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-01-31-at-20.10.33-300x77.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-01-31-at-20.10.33-768x197.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-01-31-at-20.10.33-1024x262.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-01-31-at-20.10.33-500x128.png 500w\" sizes=\"auto, (max-width: 1202px) 100vw, 1202px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">Publisher<\/span><\/code>, \u0435\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f <code><span style=\"color: #0000ff;\">url<\/span><\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code><span style=\"color: #0000ff;\">Endpoint <\/span><\/code>\u00a0\u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u041c\u043e\u0434\u0435\u043b\u0438 &#8212;\u00a0 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044e\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code>, \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">[Story]<\/span><\/code>\u00a0\u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">[Int]<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12144 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15.png\" alt=\"\" width=\"1148\" height=\"866\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15.png 1148w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-300x226.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-768x579.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-1024x772.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-398x300.png 398w\" sizes=\"auto, (max-width: 1148px) 100vw, 1148px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0438&#187; <code><span style=\"color: #0000ff;\">AnyPublisher<\/span><\/code> \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 &#171;\u043d\u0435 \u0432\u0437\u043b\u0435\u0442\u0430\u044e\u0442&#187;, \u043e\u043d\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0430 \u043d\u0438\u0445 \u043a\u0442\u043e-\u0442\u043e \u043d\u0435 \u00ab\u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442\u0441\u044f\u00bb. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 <code>UI<\/code>\u00a0\u0432\u00a0<code>SwiftUI<\/code>\u00a0\u0438 &#171;\u043f\u043e\u0434\u043f\u0438\u0448\u0435\u043c\u0441\u044f&#187; \u043d\u0430 \u043d\u0438\u0445 \u0432\u00a0\u00a0<code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code>\u00a0\u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u0418 \u0421\u0418\u041d\u0425\u0420\u041e\u041d\u0418\u0417\u0418\u0420\u0423\u0415\u0422 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u00a0<code><span style=\"color: #0000ff;\">View<\/span><\/code>.<\/span><\/p>\n<h1>&#171;\u0418\u0437\u0434\u0430\u0442\u0435\u043b\u0438&#187; <code><span style=\"color: #0000ff;\">Publisher<\/span><\/code> \u043a\u0430\u043a View Model \u0432 <code>SwiftUI<\/code>. \u0421\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439.<\/h1>\n<p><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432 <code>SwiftUI<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0438&#187; \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u044b\u0445 \u0441\u0432\u0435\u0436\u0438\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0441 \u0441\u0430\u0439\u0442\u0430\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>.<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12104 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50.png\" alt=\"\" width=\"2006\" height=\"1356\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50.png 2006w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-300x203.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-768x519.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-1024x692.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50-444x300.png 444w\" sizes=\"auto, (max-width: 2006px) 100vw, 2006px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u0435\u0436\u0438\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0430\u0439\u0442\u0430\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043c\u0435\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u0439: \u0441\u0432\u0435\u0436\u0438\u0435 (<code>news<\/code>), \u0442\u043e\u043f\u043e\u0432\u044b\u0435 (<code>top<\/code>) \u0438\u043b\u0438 \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 (<code>best<\/code>):<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12128 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50.png\" alt=\"\" width=\"1966\" height=\"1326\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50.png 1966w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-300x202.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-768x518.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-1024x691.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-445x300.png 445w\" sizes=\"auto, (max-width: 1966px) 100vw, 1966px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModel<\/span><\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b <code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code>\u00a0\u0441 \u0442\u0440\u0435\u043c\u044f\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code> \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u00a0<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12114 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42.png\" alt=\"\" width=\"1276\" height=\"1348\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42.png 1276w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42-284x300.png 284w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42-768x811.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42-969x1024.png 969w\" sizes=\"auto, (max-width: 1276px) 100vw, 1276px\" \/><\/a><\/p>\n<ul>\n<li><span style=\"font-weight: 400;\">\u043e\u0434\u043d\u043e\u00a0<code><span style=\"color: #0000ff;\">@Published var indexEndpoint: Int<\/span><\/code> &#8212; \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 <code><span style=\"color: #0000ff;\">Endpoint<\/span><\/code> (\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0435\u0433\u043e &#171;\u0432\u0445\u043e\u0434\u043e\u043c&#187;, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 <code><span style=\"color: #0000ff;\">View<\/span><\/code>),\u00a0\u00a0<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u0432\u0442\u043e\u0440\u043e\u0435\u00a0<code><span style=\"color: #0000ff;\">@Published var currentDate: Date<\/span><\/code> &#8212; \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f (\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0435\u0433\u043e &#171;\u0432\u0445\u043e\u0434\u043e\u043c&#187;, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 <code><span style=\"color: #0000ff;\">View<\/span><\/code>\u00a0\u0432\u043d\u0435\u0448\u043d\u0438\u043c &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u043c&#187; <code><span style=\"color: #0000ff;\">Timer<\/span><\/code>),\u00a0\u00a0<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\u0442\u0440\u0435\u0442\u044c\u0435\u00a0<code><span style=\"color: #0000ff;\">@Published var stories: [Story]<\/span><\/code>\u00a0&#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439 (\u0443\u0441\u043b\u043e\u0432\u043d\u043e &#171;\u0432\u044b\u0445\u043e\u0434&#187;, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0430\u0439\u0442\u0430 \u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00a0<code><span style=\"color: #0000ff;\">currentDate<\/span><\/code>\u00a0\u0438 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e\u00a0<code><span style=\"color: #0000ff;\">indexEndpoint<\/span><\/code>).<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u043f\u0435\u0440\u0435\u0434 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c\u00a0<code><span style=\"color: #0000ff;\">currentDate<\/span><\/code>, \u043c\u044b\u00a0\u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u00a0<code><span style=\"color: #0000ff;\">currentDate<\/span><\/code>,\u00a0 \u0438 \u043a\u0430\u043a &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0<code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code>. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0412 \u043a\u043b\u0430\u0441\u0441\u0435\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModel<\/span><\/code>, \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u043e \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0421 \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430\u00a0\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModel<\/span><\/code>\u00a0\u0432 <code><span style=\"color: #0000ff;\">init?<\/span><\/code> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443&#187;, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e &#171;\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430&#187; \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModel<\/span><\/code>, \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u00a0 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>\u00a0\u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00a0<code><span style=\"color: #0000ff;\">currentDate<\/span><\/code>\u00a0\u0438 \u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u00a0<code><span style=\"color: #0000ff;\">indexEndpoint<\/span><\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 <code>Combine<\/code> \u043c\u044b \u043f\u0440\u043e\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043e\u0442 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187; <code><span style=\"color: #0000ff;\">$currentDate <\/span><\/code>\u00a0\u0438\u00a0<code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code> \u0434\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">AnyPublisher&lt;[Story], Never&gt;<\/span><\/code>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439. \u0412\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043c\u044b &#171;\u043f\u043e\u0434\u043f\u0438\u0448\u0435\u043c\u0441\u044f&#187; \u043d\u0430 \u043d\u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430&#187;\u00a0<code><span style=\"color: #0000ff;\">sink<\/span><\/code>\u00a0\u0438 \u0432 \u0435\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">receiveValue<\/span><\/code>\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>\u00a0\u043a\u0430\u043a &#171;\u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435&#187;\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0435 <code>UI.<\/code><\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0442\u044f\u043d\u0443\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u041d\u0415 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <code><span style=\"color: #0000ff;\">currentDate <\/span><\/code>\u00a0\u0438\u00a0<code><span style=\"color: #0000ff;\">indexEndpoint <\/span><\/code>\u00a0, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187; <code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code>\u00a0\u0438\u00a0<code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <code>UI<\/code>\u00a0\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">Timer<\/span><\/code> \u0438 <code><span style=\"color: #0000ff;\">Picker<\/span><\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0412 \u043d\u0430\u0448\u0435\u043c \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code><span style=\"color: #0000ff;\">stories (from: Endpoint)<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0435\u00a0<code><span style=\"color: #0000ff;\">NewsAPI<\/span><\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0<code><span style=\"color: #0000ff;\">AnyPublisher&lt;[Story], Never&gt;<\/span><\/code>, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u00a0<code><span style=\"color: #0000ff;\">Endpoint<\/span><\/code>, \u0438 \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0<code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">endpoint<\/span><\/code>, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00a0<code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">C\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187;\u00a0<code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code>\u00a0\u0438\u00a0<code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 <code>Combine<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u00a0<code><span style=\"color: #0000ff;\">Publishers.CombineLatest<\/span><\/code><\/span>:<\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.32.00.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12120 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.32.00.png\" alt=\"\" width=\"982\" height=\"66\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.32.00.png 982w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.32.00-300x20.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.32.00-768x52.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.32.00-500x34.png 500w\" sizes=\"auto, (max-width: 982px) 100vw, 982px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443\u00a0 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044e\u00a0<code><span style=\"color: #0000ff;\">stories (from: Endpoint)<\/span><\/code>\u00a0\u0432\u00a0<code>Combine<\/code> \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442\u00a0<\/span><span style=\"font-weight: 400;\">\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u00a0<code><span style=\"color: #0000ff;\">flatMap<\/span><\/code>:<br \/>\n<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.38.10.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12121 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.38.10.png\" alt=\"\" width=\"1020\" height=\"158\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.38.10.png 1020w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.38.10-300x46.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.38.10-768x119.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.38.10-500x77.png 500w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code><span style=\"color: #0000ff;\">flatMap<\/span><\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 <code>main<\/code> \u043f\u043e\u0442\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<code> UI<\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.50.26.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12122 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.50.26.png\" alt=\"\" width=\"1034\" height=\"202\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.50.26.png 1034w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.50.26-300x59.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.50.26-768x150.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.50.26-1024x200.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.50.26-500x98.png 500w\" sizes=\"auto, (max-width: 1034px) 100vw, 1034px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u0430\u043b\u0435\u0435 \u043c\u044b &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0441\u044f&#187; \u043d\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u043d\u043e\u0432\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430&#187;\u00a0<code><span style=\"color: #0000ff;\">sink<\/span><\/code>\u00a0\u0438 \u0435\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u00a0<code><span style=\"color: #0000ff;\">receiveValue<\/span><\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>\u00a0, \u043d\u043e \u043c\u044b \u043d\u0435 \u0441\u043f\u0435\u0448\u0438\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0442 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u043c\u0430\u0441\u0441\u0438\u0432\u0443\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.53.35.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12123 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.53.35.png\" alt=\"\" width=\"1158\" height=\"562\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.53.35.png 1158w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.53.35-300x146.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.53.35-768x373.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.53.35-1024x497.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.53.35-500x243.png 500w\" sizes=\"auto, (max-width: 1158px) 100vw, 1158px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u041c\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c <code><span style=\"color: #0000ff;\">id<\/span><\/code> \u0441\u0430\u043c\u043e\u0439 \u0441\u0432\u0435\u0436\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437 \u0432\u043d\u043e\u0432\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">currentIds.first!<\/span><\/code>\u00a0\u0438 <code><span style=\"color: #0000ff;\">id<\/span><\/code> \u0441\u0430\u043c\u043e\u0439 \u0441\u0432\u0435\u0436\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u0443\u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, <code><span style=\"color: #0000ff;\">oldIds.first!<\/span><\/code>. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f, \u0442\u043e \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code><span style=\"color: #0000ff;\">stories<\/span><\/code>\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u043c\u0430\u0441\u0441\u0438\u0432\u0443\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044f \u0435\u0433\u043e \u0432 <code><span style=\"color: #0000ff;\">oldStories<\/span><\/code> \u0438 \u043f\u043e\u0434\u0430\u0432\u0430\u044f \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e <code><span style=\"color: #0000ff;\">@Published<\/span><\/code> \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<br \/>\n\u041c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0432 <code><span style=\"color: #0000ff;\">init( )<\/span><\/code> \u0410\u0421\u0418\u041d\u0425\u0420\u041e\u041d\u041d\u041e\u0413\u041e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; \u0438 &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c&#187; \u043d\u0430 \u043d\u0435\u0433\u043e, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0432 <code><span style=\"color: #0000ff;\">AnyCancellable<\/span><\/code> &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443&#187;, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code><span style=\"color: #0000ff;\">private\u00a0var subscriptions<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.56.56.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12124 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.56.56.png\" alt=\"\" width=\"1252\" height=\"776\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.56.56.png 1252w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.56.56-300x186.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.56.56-768x476.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.56.56-1024x635.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.56.56-484x300.png 484w\" sizes=\"auto, (max-width: 1252px) 100vw, 1252px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">&#171;\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430&#187; \u043d\u0430 \u0410\u0421\u0418\u041d\u0425\u0420\u041e\u041d\u041d\u041e\u0413\u041e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0432 <code><span style=\"color: #0000ff;\">init( )<\/span><\/code><\/span><span style=\"font-weight: 400;\">, \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u201c\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\u201d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code><span style=\"color: #0000ff;\">StoriesViewModel<\/span><\/code>. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435&#187;, \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187; <code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code>\u00a0\u0438\u00a0<code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code> \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439\u00a0 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code> \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439. \u0422\u0430\u043a\u043e\u0439\u00a0<code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code> \u043a\u043b\u0430\u0441\u0441\u00a0\u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u00a0<code>View Model<\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>View Model<\/code> \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (<code>UI<\/code>). \u0412 <code>SwiftUI<\/code> \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 <code><span style=\"color: #0000ff;\">View<\/span><\/code> c <code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code>\u00a0\u041c\u043e\u0434\u0435\u043b\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code><span style=\"color: #0000ff;\">@ObservedObject<\/span><\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u044d\u0442\u043e\u0439 \u041c\u043e\u0434\u0435\u043b\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u043f\u0430\u0440\u0430 &#8212;\u00a0<code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code>\u00a0\u043a\u043b\u0430\u0441\u0441 \u0438\u00a0<code><span style=\"color: #0000ff;\">@ObservedObject<\/span><\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 &#8212; \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c\u00a0\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (<code>UI<\/code>) \u0432\u00a0<code>SwiftUI<\/code>. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u00a0<code><span style=\"color: #0000ff;\">StoriesView<\/span><\/code>\u00a0\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code><span style=\"color: #0000ff;\"> var model<\/span><\/code>, \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u0422\u0418\u041f\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModel<\/span><\/code>, \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043c <code><span style=\"color: #0000ff;\">Text (\"Hello, World!\")<\/span><\/code> \u043d\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">List<\/span><\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">model.stories<\/span><\/code>, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435\u00a0 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439\u00a0<code>View Model<\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.22.58.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12078 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.22.58.png\" alt=\"\" width=\"1116\" height=\"852\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.22.58.png 1116w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.22.58-300x229.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.22.58-768x586.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.22.58-1024x782.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.22.58-393x300.png 393w\" sizes=\"auto, (max-width: 1116px) 100vw, 1116px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0430\u0442\u0435\u0439 \u0434\u043b\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <code><span style=\"color: #0000ff;\">currentDate = Date()<\/span><\/code> \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code><span style=\"color: #0000ff;\">indexEndpoint = 0<\/span><\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439 \u0441\u0432\u0435\u0436\u0438\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0<code><span style=\"color: #0000ff;\">.newstories<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.21.47.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12077 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.21.47.png\" alt=\"\" width=\"1772\" height=\"1394\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.21.47.png 1772w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.21.47-300x236.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.21.47-768x604.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.21.47-1024x806.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-02-27-at-17.21.47-381x300.png 381w\" sizes=\"auto, (max-width: 1772px) 100vw, 1772px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187; <code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code>\u00a0\u0438\u00a0<code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code> \u0432 \u043d\u0430\u0448\u0435\u0439 <code><span style=\"color: #0000ff;\">model<\/span><\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code> \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c&#187; <code><span style=\"color: #0000ff;\">Timer<\/span><\/code> \u0438 \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u0435\u0433\u043e \u0432 <code><span style=\"color: #0000ff;\">onReceive (timer)<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-21.53.40.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12125 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-21.53.40.png\" alt=\"\" width=\"1108\" height=\"1026\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-21.53.40.png 1108w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-21.53.40-300x278.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-21.53.40-768x711.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-21.53.40-1024x948.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-21.53.40-324x300.png 324w\" sizes=\"auto, (max-width: 1108px) 100vw, 1108px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u043e\u043f\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0<code><span style=\"color: #0000ff;\">.newstories<\/span><\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0435 1-2 \u043c\u0438\u043d\u0443\u0442\u044b, \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u0447\u0442\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.03.04.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12126 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.03.04.png\" alt=\"\" width=\"1324\" height=\"1332\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.03.04.png 1324w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.03.04-150x150.png 150w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.03.04-298x300.png 298w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.03.04-768x773.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.03.04-1018x1024.png 1018w\" sizes=\"auto, (max-width: 1324px) 100vw, 1324px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code>, \u0435\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code><span style=\"color: #0000ff;\">Picker<\/span><\/code> \u043d\u0430 \u043d\u0430\u0448 <code>UI<\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.05.55.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12127 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.05.55.png\" alt=\"\" width=\"1120\" height=\"1300\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.05.55.png 1120w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.05.55-258x300.png 258w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.05.55-768x891.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.05.55-882x1024.png 882w\" sizes=\"auto, (max-width: 1120px) 100vw, 1120px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u00a0 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 (<code>news<\/code>), \u043d\u043e \u0438 \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 (<code>top<\/code>), \u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 (<code>best<\/code>):<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12128 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50.png\" alt=\"\" width=\"1966\" height=\"1326\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50.png 1966w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-300x202.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-768x518.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-1024x691.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.15.50-445x300.png 445w\" sizes=\"auto, (max-width: 1966px) 100vw, 1966px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e <code><span style=\"color: #0000ff;\">View<\/span><\/code>:<br \/>\n<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.26.00.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12129 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.26.00.png\" alt=\"\" width=\"1710\" height=\"1396\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.26.00.png 1710w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.26.00-300x245.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.26.00-768x627.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.26.00-1024x836.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.26.00-367x300.png 367w\" sizes=\"auto, (max-width: 1710px) 100vw, 1710px\" \/><\/a><\/p>\n<h1>\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f View Model \u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>.<\/h1>\n<p><span style=\"font-weight: 400;\">\u0425\u043e\u0442\u044f \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 <code>View Model<\/code> \u043c\u044b \u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0435\u0440 <code><span style=\"color: #0000ff;\">Timer<\/span><\/code>, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432\u043d\u043e\u0432\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b &#171;\u0441\u0442\u0430\u0440\u044b\u0445&#187;\u00a0 \u0438\u0441\u0442\u043e\u0440\u0438\u0439. \u0415\u0441\u043b\u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u043e\u0432\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 &#171;\u0441\u0432\u0435\u0436\u0438\u0439&#187;, \u043c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">stories<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.31.03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12131 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.31.03.png\" alt=\"\" width=\"1236\" height=\"658\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.31.03.png 1236w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.31.03-300x160.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.31.03-768x409.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.31.03-1024x545.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.31.03-500x266.png 500w\" sizes=\"auto, (max-width: 1236px) 100vw, 1236px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0440\u0430\u043d\u044c\u0448\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 <code><span style=\"color: #0000ff;\">currentIds<\/span><\/code>\u00a0\u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u0443\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\u00a0\u00a0<code><span style=\"color: #0000ff;\">oldIds<\/span><\/code> \u0441 \u043d\u043e\u0432\u044b\u043c\u0438\u00a0<code><span style=\"color: #0000ff;\">currentIds<\/span><\/code>, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u043e\u0432\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u00a0<code><span style=\"color: #0000ff;\">currentIds<\/span><\/code> \u0438\u0441\u0442\u043e\u0440\u0438\u0438.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c&#187; <code><span style=\"color: #0000ff;\">AnyPublisher&lt;[Int], Never&gt;<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u0439. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0<code><span style=\"color: #0000ff;\">func storyIDs(from endpoint: Endpoint) -&gt; AnyPublisher&lt;[Int], Never&gt;<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code><span style=\"color: #0000ff;\">NewsAPI<\/span><\/code> :<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.38.54.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12132 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.38.54.png\" alt=\"\" width=\"1088\" height=\"228\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.38.54.png 1088w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.38.54-300x63.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.38.54-768x161.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.38.54-1024x215.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.38.54-500x105.png 500w\" sizes=\"auto, (max-width: 1088px) 100vw, 1088px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043d\u043e\u0432\u043e\u0439 <code>View Model<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0437\u043e\u0432\u0451\u043c\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModelID<\/span><\/code>\u00a0\u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.44.08.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12133 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.44.08.png\" alt=\"\" width=\"1228\" height=\"1634\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.44.08.png 1228w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.44.08-225x300.png 225w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.44.08-768x1022.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.44.08-770x1024.png 770w\" sizes=\"auto, (max-width: 1228px) 100vw, 1228px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0417\u0434\u0435\u0441\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 &#171;\u0432\u0445\u043e\u0434\u043d\u044b\u0435&#187; \u0438 &#171;\u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435&#187;\u00a0\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e \u0438 \u0432\u00a0<code>View Model<\/code>\u00a0\u0441 \u0438\u043c\u0435\u043d\u0435\u043c\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModel<\/span><\/code>, \u0438 \u0442\u0435 \u0436\u0435 &#171;\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u044b&#187; &#8212;\u00a0 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0438&#187; <code><span style=\"color: #0000ff;\">$currentDate<\/span><\/code>\u00a0\u0438\u00a0<code><span style=\"color: #0000ff;\">$indexEndpoint<\/span><\/code>, \u043d\u043e \u0441\u0430\u043c\u0430 &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430&#187; \u0432 <code><span style=\"color: #0000ff;\">init()<\/span><\/code> \u0438\u0434\u0435\u0442 \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044e.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445\u00a0<code><span style=\"color: #0000ff;\">flatMap<\/span><\/code>\u00a0\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430 \u043e\u0434\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>\u00a0\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<\/span><span style=\"font-weight: 400;\"> <code><span style=\"color: #0000ff;\">self.api.storyIDs (from: Endpoint (index: indexEndpoint )! )<\/span><\/code> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u00a0<code><span style=\"color: #0000ff;\">currentIds<\/span><\/code>\u00a0\u043d\u043e\u0432\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439.\u00a0<\/span><span style=\"font-weight: 400;\">\u0417\u0430\u0442\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0435 <code><span style=\"color: #0000ff;\">map<\/span><\/code> \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u00a0\u0441\u0442\u0430\u0440\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432\u00a0<code><span style=\"color: #0000ff;\">oldIds<\/span><\/code> \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438\u00a0<code><span style=\"color: #0000ff;\">currentIds<\/span><\/code>, \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0438\u0445 \u043d\u0430 <code>UI<\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.53.15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12134 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.53.15.png\" alt=\"\" width=\"1126\" height=\"454\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.53.15.png 1126w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.53.15-300x121.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.53.15-768x310.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.53.15-1024x413.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.53.15-500x202.png 500w\" sizes=\"auto, (max-width: 1126px) 100vw, 1126px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0414\u0430\u043b\u0435\u0435 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0443\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e\u00a0<code><span style=\"color: #0000ff;\">flatMap<\/span><\/code>, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\u00a0 \u00a0<code><span style=\"color: #0000ff;\">storyIDs<\/span><\/code> \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c\u00a0\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">Story<\/span><\/code> \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u00a0 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0<code><span style=\"color: #0000ff;\">mergedStories<\/span><\/code>. \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 <code><span style=\"color: #0000ff;\">[Story]<\/span><\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code><span style=\"color: #0000ff;\">collect<\/span><\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u00a0\u0438\u0441\u0442\u043e\u0440\u0438\u0439 :<br \/>\n<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.57.39.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12135 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.57.39.png\" alt=\"\" width=\"1096\" height=\"720\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.57.39.png 1096w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.57.39-300x197.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.57.39-768x505.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.57.39-1024x673.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-22.57.39-457x300.png 457w\" sizes=\"auto, (max-width: 1096px) 100vw, 1096px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0441\u044f&#187; \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code><span style=\"color: #0000ff;\">sink<\/span><\/code> \u0438 \u0435\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u00a0<code><span style=\"color: #0000ff;\">receiveValue<\/span><\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>\u00a0\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00a0\u00a0<code><span style=\"color: #0000ff;\">@Published<\/span><\/code>\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443\u00a0<code><span style=\"color: #0000ff;\">stories<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.00.40.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12136 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.00.40.png\" alt=\"\" width=\"1112\" height=\"974\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.00.40.png 1112w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.00.40-300x263.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.00.40-768x673.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.00.40-1024x897.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.00.40-343x300.png 343w\" sizes=\"auto, (max-width: 1112px) 100vw, 1112px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435\u00a0<code><span style=\"color: #0000ff;\">AnyCancellable<\/span><\/code> &#171;\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443&#187; \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code><span style=\"color: #0000ff;\">private\u00a0var subscriptions<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.03.40.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12137 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.03.40.png\" alt=\"\" width=\"1174\" height=\"1114\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.03.40.png 1174w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.03.40-300x285.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.03.40-768x729.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.03.40-1024x972.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.03.40-316x300.png 316w\" sizes=\"auto, (max-width: 1174px) 100vw, 1174px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u0418 \u044d\u0442\u043e \u0432\u0441\u0451. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u043e\u0432\u0430\u044f\u00a0<code>View Model<\/code>\u00a0&#8212;\u00a0\u00a0<code><span style=\"color: #0000ff;\">StoriesViewModelID<\/span><\/code>, \u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e UI, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u00a0<code><span style=\"color: #0000ff;\">StoriesView<\/span><\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0435 \u0431\u0443\u043a\u0432\u044b:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.09.32.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12138 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.09.32.png\" alt=\"\" width=\"1772\" height=\"1410\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.09.32.png 1772w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.09.32-300x239.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.09.32-768x611.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.09.32-1024x815.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-23.09.32-377x300.png 377w\" sizes=\"auto, (max-width: 1772px) 100vw, 1772px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Combine<\/code> \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 <code>HTTP<\/code> \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code><span style=\"color: #0000ff;\">flatMap<\/span><\/code>.<\/span><\/p>\n<h1>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/h1>\n<p><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u00a0\u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u00a0\u0432\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0434\u043b\u044f <a href=\"https:\/\/bestkora.com\/IosDeveloper\/modern-networking-in-swift-5-with-urlsession-combine-and-codable\/\">\u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u043b\u044c\u043c\u043e\u0432\u00a0<\/a><a href=\"https:\/\/developers.themoviedb.org\/3\/getting-started\/introduction\">TMDb<\/a>\u00a0 \u0438 <a href=\"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-urlsession-combine-i-codable-chast-2\/\">\u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0\u00a0NewsAPI.org<\/a>. \u0425\u043e\u0442\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0438\u043b\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u043a\u0430\u043a \u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u0435\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u0447\u0435\u043c \u0432 \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u043c \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0435\u00a0<a href=\"https:\/\/newsapi.org\/\">NewsAPI.org<\/a>, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>Combine<\/code>, \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0441\u0432\u043e\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0422\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u0432\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445\u00a0\u043c\u044b \u043e\u043f\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e <code>Generic<\/code> &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">AnyPublisher&lt;T, Never&gt;<\/span><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 <code>JSON<\/code> \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0451 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 <code><span style=\"color: #0000ff;\">Codable<\/span><\/code> \u041c\u043e\u0434\u0435\u043b\u0438 <code><span style=\"color: #0000ff;\">T<\/span><\/code>\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438\u00a0\u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e\u00a0<code><span style=\"color: #0000ff;\">url<\/span><\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-02-06-at-18.23.13.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11939 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-02-06-at-18.23.13.png\" alt=\"\" width=\"1200\" height=\"296\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-02-06-at-18.23.13.png 1200w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-02-06-at-18.23.13-300x74.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-02-06-at-18.23.13-768x189.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-02-06-at-18.23.13-1024x253.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/01\/Screenshot-2020-02-06-at-18.23.13-500x123.png 500w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0<code><span style=\"color: #0000ff;\">AnyPublisher&lt;Story, Never&gt;<\/span><\/code>, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0434\u043d\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u044e, \u0438 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187;\u00a0<code><span style=\"color: #0000ff;\">AnyPublisher&lt;[Stories], Never&gt;<\/span><\/code>, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0438 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f&#187; <code><span style=\"color: #0000ff;\">AnyPublisher&lt;[Int], Never&gt;<\/span><\/code>, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0439, \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12144 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15.png\" alt=\"\" width=\"1148\" height=\"866\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15.png 1148w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-300x226.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-768x579.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-1024x772.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-02-at-18.03.15-398x300.png 398w\" sizes=\"auto, (max-width: 1148px) 100vw, 1148px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439&#187; \u043b\u0435\u0433\u043a\u043e &#171;\u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c&#187; \u0432 <code><span style=\"color: #0000ff;\">ObservableObject<\/span><\/code> \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0438\u0445 <code><span style=\"color: #0000ff;\">@Published<\/span><\/code> \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u00a0\u00a0<code>UI<\/code>, \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>SwiftUI<\/code>. \u042d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f\u00a0<code>View Model<\/code>:<\/span><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12114 size-full\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42.png\" alt=\"\" width=\"1276\" height=\"1348\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42.png 1276w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42-284x300.png 284w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42-768x811.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-20.00.42-969x1024.png 969w\" sizes=\"auto, (max-width: 1276px) 100vw, 1276px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u042d\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f <code>View Model<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u0418 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u00a0 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>. &#171;\u0418\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u043e\u043c&#187; \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u0438\u0439 &#171;\u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c&#187; <code><span style=\"color: #0000ff;\">Timer<\/span><\/code>\u00a0\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435\u00a0<a href=\"https:\/\/news.ycombinator.com\/newest\">Hacker News<\/a>, \u0442\u0430\u043a \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u0430\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439: \u0441\u0430\u043c\u044b\u0445 \u0441\u0432\u0435\u0436\u0438\u0445, \u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0438\u043b\u0438 \u0441\u0430\u043c\u044b\u0445 \u043b\u0443\u0447\u0448\u0438\u0445.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u041a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/BestKora\/HackerNewsApp\"><strong>Github<\/strong><\/a>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0421\u0441\u044b\u043b\u043a\u0438:<\/span><\/p>\n<p class=\"post-full-title\"><strong><a href=\"https:\/\/www.vadimbulavin.com\/modern-networking-in-swift-5-with-urlsession-combine-framework-and-codable\/\">Modern Networking in Swift 5 with URLSession, Combine and Codable.<\/a><\/strong><\/p>\n<h1><a href=\"https:\/\/oleb.net\/2020\/urlsession-publisher\/\">URLSession.DataTaskPublisher\u2019s failure type<\/a><\/h1>\n<p><a href=\"https:\/\/store.raywenderlich.com\/products\/combine-asynchronous-programming-with-swift\"><strong>Combine: Asynchronous Programming with Swift<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/bestkora.com\/IosDeveloper\/swiftui-combine-vmeste-luchshe-pochemu-swiftui-i-combine-pomogut-vam-sozdavat-bolee-luchshie-prilozheniya\/\"><span style=\"font-weight: 400;\"><strong>&#171;SwiftUI &amp; Combine: \u041b\u0443\u0447\u0448\u0435 \u0432\u043c\u0435\u0441\u0442\u0435&#187;<\/strong><\/span><\/a><\/p>\n<p><strong><a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2019\/722\/\">Introducing Combine &#8212; WWDC 2019 &#8212; Videos &#8212; Apple Developer. session 722 <\/a><\/strong><\/p>\n<p><strong><a href=\"https:\/\/drive.google.com\/file\/d\/1O4QARAjjFEjjH9_EiDIuUqoalq0rL8PS\/view?usp=sharing\">(\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 722 &#171;\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 Combine&#187; \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435)<\/a><\/strong><\/p>\n<p><a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2019\/721\"><strong>Combine in Practice &#8212; WWDC 2019 &#8212; Videos &#8212; Apple Developer. session 721<\/strong><\/a><\/p>\n<p><strong><a href=\"https:\/\/docs.google.com\/document\/d\/1Klsc_7OLx_NWQ-vj6WbdyrmJG1DmoqAAoxLoVB2lbaA\/edit?usp=sharing\">(\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 721 &#171;\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 Combine&#187; \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435)<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hacker News, \u0447\u0435\u0439 API \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0430\u0439\u0442\u043e\u043c, \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0438 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u043d\u0438\u043c \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b, \u0442\u043e \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445\u00a0\u00a0\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u043b\u044c\u043c\u043e\u0432\u00a0TMDb\u00a0\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0NewsAPI.org\u00a0\u0431\u044b\u043b\u0430 &hellip; <a href=\"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/\">\u0427\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[60,55,54],"tags":[],"class_list":["post-12025","post","type-post","status-publish","format-standard","hentry","category-combine","category-ios-13","category-swiftui"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d &quot;\u0432\u043d\u0435\u0448\u043d\u0438\u0439&quot; \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c Timer.\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"tatiana.kornilova@gmail.com\"\/>\n\t<meta name=\"keywords\" content=\"combine,apple,publisher,subscriber,swift 5,http request,anycancellable,receivecompletion,receivevalue,datataskpublisher,assing(to:,on:),sink,swiftui,observableobject,view model,erasetoanypublisher,identifiable,@observedobject,\u00a0hacker news\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"ru_RU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d &quot;\u0432\u043d\u0435\u0448\u043d\u0438\u0439&quot; \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c Timer.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-27T15:20:05+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T07:55:35+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta name=\"twitter:description\" content=\"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d &quot;\u0432\u043d\u0435\u0448\u043d\u0438\u0439&quot; \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c Timer.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#article\",\"name\":\"\\u0421\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u0434 \\u0434\\u043b\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f HTTP \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u043e\\u0432 \\u0432 Swift 5 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Combine \\u0438 \\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0445 \\u0432 SwiftUI. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u041d\\u043e\\u0432\\u043e\\u0441\\u0442\\u0438 Hacker News. | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"headline\":\"\\u0421\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u0434 \\u0434\\u043b\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f HTTP \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u043e\\u0432 \\u0432 Swift 5 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Combine \\u0438 \\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0445 \\u0432 SwiftUI. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u041d\\u043e\\u0432\\u043e\\u0441\\u0442\\u0438 Hacker News.\",\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/wp-content\\\/uploads\\\/2020\\\/02\\\/Screenshot-2020-03-01-at-18.58.50.png\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#articleImage\",\"width\":2006,\"height\":1356},\"datePublished\":\"2020-02-27T15:20:05+00:00\",\"dateModified\":\"2020-03-03T07:55:35+00:00\",\"inLanguage\":\"ru-RU\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#webpage\"},\"articleSection\":\"Combine, iOS 13, SwiftUI\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swiftui\\\/#listItem\",\"name\":\"SwiftUI\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swiftui\\\/#listItem\",\"position\":2,\"name\":\"SwiftUI\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swiftui\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#listItem\",\"name\":\"\\u0421\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u0434 \\u0434\\u043b\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f HTTP \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u043e\\u0432 \\u0432 Swift 5 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Combine \\u0438 \\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0445 \\u0432 SwiftUI. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u041d\\u043e\\u0432\\u043e\\u0441\\u0442\\u0438 Hacker News.\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#listItem\",\"position\":3,\"name\":\"\\u0421\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u0434 \\u0434\\u043b\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f HTTP \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u043e\\u0432 \\u0432 Swift 5 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Combine \\u0438 \\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0445 \\u0432 SwiftUI. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u041d\\u043e\\u0432\\u043e\\u0441\\u0442\\u0438 Hacker News.\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swiftui\\\/#listItem\",\"name\":\"SwiftUI\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#webpage\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/\",\"name\":\"\\u0421\\u043e\\u0432\\u0440\\u0435\\u043c\\u0435\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u0434 \\u0434\\u043b\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f HTTP \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u043e\\u0432 \\u0432 Swift 5 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Combine \\u0438 \\u043f\\u0440\\u0438\\u043c\\u0435\\u043d\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0445 \\u0432 SwiftUI. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u041d\\u043e\\u0432\\u043e\\u0441\\u0442\\u0438 Hacker News. | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u0412\\u043e\\u0441\\u043f\\u0440\\u043e\\u0438\\u0437\\u0432\\u0435\\u0434\\u0435\\u043d\\u0430 \\u0441\\u0442\\u0440\\u0430\\u0442\\u0435\\u0433\\u0438\\u044e \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f HTTP \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u043e\\u0432 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Combine \\u0434\\u043b\\u044f \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0438 \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f, \\u0432\\u0437\\u0430\\u0438\\u043c\\u043e\\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0443\\u044e\\u0449\\u0435\\u0433\\u043e \\u0441 \\u0430\\u0433\\u0440\\u0435\\u0433\\u0430\\u0442\\u043e\\u0440\\u043e\\u043c \\u043d\\u043e\\u0432\\u043e\\u0441\\u0442\\u0435\\u0439 Hacker News, \\u043d\\u043e \\u0434\\u043e\\u0431\\u0430\\u0432\\u043b\\u0435\\u043d \\\"\\u0432\\u043d\\u0435\\u0448\\u043d\\u0438\\u0439\\\" \\u0438\\u0437\\u0434\\u0430\\u0442\\u0435\\u043b\\u044c Timer.\",\"inLanguage\":\"ru-RU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"datePublished\":\"2020-02-27T15:20:05+00:00\",\"dateModified\":\"2020-03-03T07:55:35+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/\",\"name\":\"\\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u0420\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 \\u043d\\u0435\\u0430\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0441\\u043f\\u0435\\u043a\\u0442 \\u043b\\u0435\\u043a\\u0446\\u0438\\u0439 \\u0421\\u0442\\u044d\\u043d\\u0444\\u043e\\u0440\\u0434\\u0441\\u043a\\u043e\\u0433\\u043e \\u0443\\u043d\\u0438\\u0432\\u0435\\u0440\\u0441\\u0438\\u0442\\u0435\\u0442\\u0430 \\\" \\u0420\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430 iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439\\\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \\u0438 2026 \\u0433\\u0433., \\u0441\\u043e\\u043f\\u0440\\u043e\\u0432\\u043e\\u0436\\u0434\\u0430\\u0435\\u043c\\u044b\\u0439 \\u0440\\u0435\\u0448\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438 \\u0437\\u0430\\u0434\\u0430\\u043d\\u0438\\u0439 \\u0438 \\u0434\\u043e\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438, \\u0441\\u0432\\u044f\\u0437\\u0430\\u043d\\u043d\\u044b\\u043c\\u0438 \\u0441 \\u0430\\u0434\\u0430\\u043f\\u0442\\u0430\\u0446\\u0438\\u0435\\u0439 \\u043a\\u0443\\u0440\\u0441\\u043e\\u0432 \\u043a \\u043d\\u043e\\u0432\\u044b\\u043c \\u0432\\u0435\\u0440\\u0441\\u0438\\u044f\\u043c Swift, Objective-C \\u0438 iOS.\",\"inLanguage\":\"ru-RU\",\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \"\u0432\u043d\u0435\u0448\u043d\u0438\u0439\" \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c Timer.","canonical_url":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"combine,apple,publisher,subscriber,swift 5,http request,anycancellable,receivecompletion,receivevalue,datataskpublisher,assing(to:,on:),sink,swiftui,observableobject,view model,erasetoanypublisher,identifiable,@observedobject,\u00a0hacker news","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#article","name":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","headline":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News.","author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2020\/02\/Screenshot-2020-03-01-at-18.58.50.png","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#articleImage","width":2006,"height":1356},"datePublished":"2020-02-27T15:20:05+00:00","dateModified":"2020-03-03T07:55:35+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#webpage"},"isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#webpage"},"articleSection":"Combine, iOS 13, SwiftUI"},{"@type":"BreadcrumbList","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","position":1,"name":"Home","item":"https:\/\/bestkora.com\/IosDeveloper","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swiftui\/#listItem","name":"SwiftUI"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swiftui\/#listItem","position":2,"name":"SwiftUI","item":"https:\/\/bestkora.com\/IosDeveloper\/category\/swiftui\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#listItem","name":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News."},"previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#listItem","position":3,"name":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News.","previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swiftui\/#listItem","name":"SwiftUI"}}]},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/#person","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author","url":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"WebPage","@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#webpage","url":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/","name":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \"\u0432\u043d\u0435\u0448\u043d\u0438\u0439\" \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c Timer.","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#website"},"breadcrumb":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/#breadcrumblist"},"author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"creator":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"datePublished":"2020-02-27T15:20:05+00:00","dateModified":"2020-03-03T07:55:35+00:00"},{"@type":"WebSite","@id":"https:\/\/bestkora.com\/IosDeveloper\/#website","url":"https:\/\/bestkora.com\/IosDeveloper\/","name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \" \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"}}]},"og:locale":"ru_RU","og:site_name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","og:type":"article","og:title":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","og:description":"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d &quot;\u0432\u043d\u0435\u0448\u043d\u0438\u0439&quot; \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c Timer.","og:url":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/","article:published_time":"2020-02-27T15:20:05+00:00","article:modified_time":"2020-03-03T07:55:35+00:00","twitter:card":"summary","twitter:title":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","twitter:description":"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d &quot;\u0432\u043d\u0435\u0448\u043d\u0438\u0439&quot; \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c Timer."},"aioseo_meta_data":{"post_id":"12025","title":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News. | #site_title","description":"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\u00a0Hacker News, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d  &quot;\u0432\u043d\u0435\u0448\u043d\u0438\u0439&quot; \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u00a0Timer.","keywords":[{"label":"Combine","value":"Combine"},{"label":"Apple","value":"Apple"},{"label":"Publisher","value":"Publisher"},{"label":"Subscriber","value":"Subscriber"},{"label":"Swift 5","value":"Swift 5"},{"label":"HTTP request","value":"HTTP request"},{"label":"AnyCancellable","value":"AnyCancellable"},{"label":"receiveCompletion","value":"receiveCompletion"},{"label":"receiveValue","value":"receiveValue"},{"label":"dataTaskPublisher","value":"dataTaskPublisher"},{"label":"assing(to:","value":"assing(to:"},{"label":"on:)","value":"on:)"},{"label":"sink","value":"sink"},{"label":"SwiftUI","value":"SwiftUI"},{"label":"ObservableObject","value":"ObservableObject"},{"label":"View Model","value":"View Model"},{"label":"eraseToAnyPublisher","value":"eraseToAnyPublisher"},{"label":"Identifiable","value":"Identifiable"},{"label":"View Model","value":"View Model"},{"label":"@ObservedObject","value":"@ObservedObject"},{"label":"\u00a0Hacker News","value":"\u00a0Hacker News"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2020-12-21 06:31:32","updated":"2026-02-22 20:04:43","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\/category\/swiftui\/\" title=\"SwiftUI\">SwiftUI<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News.\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/bestkora.com\/IosDeveloper"},{"label":"SwiftUI","link":"https:\/\/bestkora.com\/IosDeveloper\/category\/swiftui\/"},{"label":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Swift 5 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Combine \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 SwiftUI. \u0427\u0430\u0441\u0442\u044c 3. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 Hacker News.","link":"https:\/\/bestkora.com\/IosDeveloper\/sovremennyj-kod-dlya-vypolneniya-http-zaprosov-v-swift-5-s-pomoshhyu-combine-i-primenenie-ih-v-swiftui-chast-3-novosti-hacker-news\/"}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/12025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/comments?post=12025"}],"version-history":[{"count":5,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/12025\/revisions"}],"predecessor-version":[{"id":12150,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/12025\/revisions\/12150"}],"wp:attachment":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/media?parent=12025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/categories?post=12025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/tags?post=12025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}