diff --git a/README.md b/README.md index 22f6682..564c648 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,27 @@ +## Known issue + +AsyncImage has an issue loading image +https://developer.apple.com/forums/thread/682498 +if you don't want to see the error then + +Replace this 👇 + +```swift +Image(systemName: "exclamationmark.triangle") + .padding() + .font(.largeTitle) +``` +with this 👇 + +```swift +EmptyView() +``` + + + ## Illustration Credit diff --git a/UnsplashPhotosApp.xcodeproj/project.pbxproj b/UnsplashPhotosApp.xcodeproj/project.pbxproj index 664ecbc..0ff6674 100644 --- a/UnsplashPhotosApp.xcodeproj/project.pbxproj +++ b/UnsplashPhotosApp.xcodeproj/project.pbxproj @@ -31,8 +31,7 @@ E23BCD6127A994790072C847 /* ErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E23BCD4B27A994790072C847 /* ErrorView.swift */; }; E23BCD6227A994790072C847 /* RecentPhotosView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E23BCD4D27A994790072C847 /* RecentPhotosView.swift */; }; E23BCD6327A994790072C847 /* TopicRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E23BCD4E27A994790072C847 /* TopicRow.swift */; }; - E2B46C2727AA096F006A747B /* PhotosService.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2B46C2627AA096F006A747B /* PhotosService.swift */; }; - E2B46C2B27AA0EB0006A747B /* PhotoService.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2B46C2A27AA0EB0006A747B /* PhotoService.swift */; }; + E2B46C2B27AA0EB0006A747B /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2B46C2A27AA0EB0006A747B /* APIService.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -63,8 +62,7 @@ E23BCD4E27A994790072C847 /* TopicRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopicRow.swift; sourceTree = ""; }; E23BCD6527A996310072C847 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; E23BCD6627A9999B0072C847 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - E2B46C2627AA096F006A747B /* PhotosService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotosService.swift; sourceTree = ""; }; - E2B46C2A27AA0EB0006A747B /* PhotoService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoService.swift; sourceTree = ""; }; + E2B46C2A27AA0EB0006A747B /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -211,8 +209,7 @@ E23BCD6727A9A7ED0072C847 /* Services */ = { isa = PBXGroup; children = ( - E2B46C2627AA096F006A747B /* PhotosService.swift */, - E2B46C2A27AA0EB0006A747B /* PhotoService.swift */, + E2B46C2A27AA0EB0006A747B /* APIService.swift */, ); path = Services; sourceTree = ""; @@ -296,12 +293,11 @@ E23BCD5227A994790072C847 /* SearchPhotoViewModel.swift in Sources */, E23BCD5F27A994790072C847 /* StaggeredPhotosView.swift in Sources */, E23BCD5727A994790072C847 /* Urls.swift in Sources */, - E2B46C2727AA096F006A747B /* PhotosService.swift in Sources */, E23BCD5E27A994790072C847 /* PhotoTile.swift in Sources */, E23BCD5027A994790072C847 /* DownloadPhotoViewModel.swift in Sources */, E23BCD6327A994790072C847 /* TopicRow.swift in Sources */, E23BCD4F27A994790072C847 /* TopicViewModel.swift in Sources */, - E2B46C2B27AA0EB0006A747B /* PhotoService.swift in Sources */, + E2B46C2B27AA0EB0006A747B /* APIService.swift in Sources */, E23BCD5927A994790072C847 /* Extensions.swift in Sources */, E23BCD6027A994790072C847 /* LoadingView.swift in Sources */, E23BCD2527A994360072C847 /* UnsplashPhotosAppApp.swift in Sources */, diff --git a/UnsplashPhotosApp/Source/Services/PhotoService.swift b/UnsplashPhotosApp/Source/Services/APIService.swift similarity index 88% rename from UnsplashPhotosApp/Source/Services/PhotoService.swift rename to UnsplashPhotosApp/Source/Services/APIService.swift index b1db2d1..90bb1aa 100644 --- a/UnsplashPhotosApp/Source/Services/PhotoService.swift +++ b/UnsplashPhotosApp/Source/Services/APIService.swift @@ -1,5 +1,5 @@ // -// PhotoService.swift +// APIService.swift // UnsplashPhotosApp // // Created by Ahmed on 02/02/22. @@ -8,7 +8,7 @@ import Foundation import Combine -class PhotoService { +class APIService { let url: URL init(_ url :URL) { diff --git a/UnsplashPhotosApp/Source/Services/PhotosService.swift b/UnsplashPhotosApp/Source/Services/PhotosService.swift deleted file mode 100644 index ad05b4f..0000000 --- a/UnsplashPhotosApp/Source/Services/PhotosService.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// PhotosService.swift -// UnsplashPhotosApp -// -// Created by Ahmed on 02/02/22. -// - -import Foundation -import Combine - -class PhotosService { - - let url: URL - - init(_ url :URL) { - self.url = url - } - - func getData() -> AnyPublisher<[T], Error> { - URLSession.shared.dataTaskPublisher(for: url) - .receive(on: DispatchQueue.main) - .map{$0.data} - .decode(type: [T].self, decoder: JSONDecoder()) - .eraseToAnyPublisher() - } -} diff --git a/UnsplashPhotosApp/Source/ViewModels/DownloadPhotoViewModel.swift b/UnsplashPhotosApp/Source/ViewModels/DownloadPhotoViewModel.swift index 5173f1b..f04ef45 100644 --- a/UnsplashPhotosApp/Source/ViewModels/DownloadPhotoViewModel.swift +++ b/UnsplashPhotosApp/Source/ViewModels/DownloadPhotoViewModel.swift @@ -32,7 +32,7 @@ class DownloadPhotoViewModel: ObservableObject { return } - let photoService = PhotoService(url) + let photoService = APIService(url) photoService.getData() .sink { [weak self] completion in diff --git a/UnsplashPhotosApp/Source/ViewModels/PhotoViewModel.swift b/UnsplashPhotosApp/Source/ViewModels/PhotoViewModel.swift index 349abea..f463fba 100644 --- a/UnsplashPhotosApp/Source/ViewModels/PhotoViewModel.swift +++ b/UnsplashPhotosApp/Source/ViewModels/PhotoViewModel.swift @@ -33,7 +33,7 @@ class PhotoViewModel : ObservableObject { return } - let photosService = PhotosService(url) + let photosService = APIService<[Photo]>(url) photosService.getData() .delay(for: 0.8, scheduler: RunLoop.main) diff --git a/UnsplashPhotosApp/Source/ViewModels/SearchPhotoViewModel.swift b/UnsplashPhotosApp/Source/ViewModels/SearchPhotoViewModel.swift index dda8d7b..a2c8ca3 100644 --- a/UnsplashPhotosApp/Source/ViewModels/SearchPhotoViewModel.swift +++ b/UnsplashPhotosApp/Source/ViewModels/SearchPhotoViewModel.swift @@ -48,7 +48,7 @@ class SearchPhotoViewModel : ObservableObject { state = .failed(URLError(URLError.badURL)) return } - let photoService = PhotoService(url) + let photoService = APIService(url) photoService.getData() .sink { [weak self] completion in diff --git a/UnsplashPhotosApp/Source/ViewModels/TopicViewModel.swift b/UnsplashPhotosApp/Source/ViewModels/TopicViewModel.swift index 3a6e335..eec45fb 100644 --- a/UnsplashPhotosApp/Source/ViewModels/TopicViewModel.swift +++ b/UnsplashPhotosApp/Source/ViewModels/TopicViewModel.swift @@ -32,7 +32,7 @@ class TopicViewModel: ObservableObject { return } - let photosService = PhotosService(url) + let photosService = APIService<[Topic]>(url) photosService.getData() .sink { [weak self] completion in