{"id":29636420,"url":"https://github.com/2gpb/vktesttask","last_synced_at":"2025-07-21T17:04:01.757Z","repository":{"id":301405698,"uuid":"1008516697","full_name":"2Gpb/VKTestTask","owner":"2Gpb","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-26T17:09:31.000Z","size":2008,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-26T18:25:37.745Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/2Gpb.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-25T17:02:06.000Z","updated_at":"2025-06-25T17:07:04.000Z","dependencies_parsed_at":"2025-06-26T18:25:53.801Z","dependency_job_id":"0624bb8c-d155-4e3c-9c22-b8e7d9ad0699","html_url":"https://github.com/2Gpb/VKTestTask","commit_stats":null,"previous_names":["2gpb/vktesttask"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/2Gpb/VKTestTask","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2Gpb%2FVKTestTask","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2Gpb%2FVKTestTask/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2Gpb%2FVKTestTask/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2Gpb%2FVKTestTask/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/2Gpb","download_url":"https://codeload.github.com/2Gpb/VKTestTask/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2Gpb%2FVKTestTask/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266341354,"owners_count":23914227,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-21T17:04:01.097Z","updated_at":"2025-07-21T17:04:01.743Z","avatar_url":"https://github.com/2Gpb.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# VKTestTask\n\n## Описание\n\nПриложение отображает список отзывов с рейтингом, текстом и фотографиями. Добавлены интерактивные элементы, кастомные анимации, асинхронная загрузка и кеширование изображений. \n\n## Условия выполнения\n\n- Верстка с использованием UIKit \n- Соблюден стиль проекта\n- Проект без сторонних библиотек\n\n---\n\n## Что реализовано\n\n- **Профиль пользователя:**\n  - Аватар\n  - Имя и фамилия\n  - Рейтинг в виде звёзд\n  - Картинки в отзыве\n\n- **Отзывы:**\n  - Поддержка нескольких изображений\n  - Раскрытие полного текста через кнопку “Показать больше”\n  - Отдельная ячейка в конце с количеством отзывов\n\n- **Асинхронная загрузка изображений:**\n  - Используется `URLSession`\n  - Запросы отменяются при переиспользовании ячеек\n  - Для загрузки используется фоновый поток\n\n- **Кеширование изображений:**\n  - Используется класс для кеширования изображений через `NSCache`\n\n- **Анимации и стейты загрузки:**\n  - Пока загружается изображение, отображается shimmer-анимация (`CAGradientLayer + CABasicAnimation`)\n  - Реализован собственный кастомный индикатор загрузки (`CAShapeLayer + rotation`)\n\n- **Оптимизация производительности:**\n  - Найдена и устранена утечка памяти: передача замыкания в `ReviewCellConfig`, которое захватывало `ViewModel`\n  - Ошибка с подвисанием при скролле была вызвана задержкой загрузки отзывов в `main queue`, переведено в фоновый поток (`GCD`)\n\n- **Интерактивность:**\n  - Поддержка `Pull to Refresh` с `UIRefreshControl`\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F2gpb%2Fvktesttask","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F2gpb%2Fvktesttask","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F2gpb%2Fvktesttask/lists"}