Skip to content

Instantly share code, notes, and snippets.

View aliakhtar49's full-sized avatar

ali akhtar aliakhtar49

View GitHub Profile
func downloadMetadata(for id: Int) async throws -> ImageMetadata {
let metadataUrl = URL(string: "https://www.andyibanez.com/fairesepages.github.io/tutorials/async-await/part1/\(id).json")!
let metadataRequest = URLRequest(url: metadataUrl)
let (data, metadataResponse) = try await URLSession.shared.data(for: metadataRequest)
guard (metadataResponse as? HTTPURLResponse)?.statusCode == 200 else {
throw ImageDownloadError.invalidMetadata
}
return try JSONDecoder().decode(ImageMetadata.self, from: data)
}
let metadataUrl = URL(string: "https://www.andyibanez.com/fairesepages.github.io/tutorials/async-await/part1/\(imageNumber).json")!
let metadataTask = URLSession.shared.dataTask(with: metadataUrl) { data, response, error in
guard let data = data, let metadata = try? JSONDecoder().decode(ImageMetadata.self, from: data), (response as? HTTPURLResponse)?.statusCode == 200 else {
completionHandler(nil, ImageDownloadError.invalidMetadata)
return
}
let detailedImage = DetailedImage(image: image, metadata: metadata)
completionHandler(detailedImage, nil)
}
metadataTask.resume()
func downloadImageAndMetadata(imageNumber: Int) async throws -> DetailedImage {
return try await withCheckedThrowingContinuation({
(continuation: CheckedContinuation<DetailedImage, Error>) in
downloadImageAndMetadata(imageNumber: imageNumber) { image, error in
if let image = image {
continuation.resume(returning: image)
} else {
continuation.resume(throwing: error!)
}
}
final class OrderTrackingViewController: UIViewController {
override func viewDidLoad() {
// Initial show loading view
ui.configureSkeltonView()
repo.fetchOrderTrackingResponse { [weak self] orderResponse in
// Response receive render whole screen with data
self?.ui.configureContainerView(response: orderResponse!)
}
}
}
func configureSkeltonView() {
[1...4].forEach { _ in
scrollStackViewContainer.addArrangedSubview(OrderTrackingSkeletonView())
}
}
func configureContainerView(response: OrderTrackingResponse) {
let paymentInfoView = PaymentInfoView(entity: ...)
let orderSummaryTitleViews = OrderSummaryTitleView(entity: ...)
let deliveryAddressView = DeliveryAddressView(entity: ...)
@aliakhtar49
aliakhtar49 / Integration.swift
Last active December 26, 2022 06:25
Integration
// Step 1 : Initialize View and interface
private let paymentDetailsInjector: PaymentDetailsViewLoadable = PaymentDetailsViewLoader()
private let paymentDetailsViewContainer: UIView = UIView()
// Step 2 : listen call backs and load view
private func commonInit() {
paymentDetailsInjector.renderView(
componentId: "123",
into: paymentDetailsViewContainer
)
private func commonInit() {
// API Hitting
fetchPaymentInfoResponse { [weak self] paymentResponse in
// Data Preparation / Business logic
let entity = PaymentInfoView.Entity(
paymentLogo: paymentResponse!.logo,
paymentDetail: paymentResponse!.details,
paymentTitleValue: paymentResponse!.title
)
self.state = .info(entity)
public protocol PaymentDetailsViewLoadable {
/// Communication with client
var output: AnyPublisher<PaymentDetailLoadableOutput, Never> { get }
/// render payment details view into the view provided
func renderView(
componentId: String,
into containerView: UIView
)
}
@aliakhtar49
aliakhtar49 / FirstViewUI.swift
Last active December 3, 2022 10:48
FirstViewUI
import UIKit
final class FirstViewUI: UIView {
var names =
[
"first",
"seo",
"psum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the in",
"four",