The following works.
import UIKit
import Combine
class ViewController: UIViewController {
// MARK: - Variables
private var cancellableSet: Set<AnyCancellable> = []
override func viewDidLoad() {
super.viewDidLoad()
let _ = Future<[DataModel], Error> { [weak self] promise in
guard let strongSelf = self else { return }
let url = URL(string: "https://api.github.com/repos/ReactiveX/RxSwift/events")!
URLSession.shared.dataTaskPublisher(for: url)
.timeout(2.0, scheduler: DispatchQueue.global(qos: .background))
.retry(3)
.map { $0.data }
.decode(type: [DataModel].self, decoder: JSONDecoder())
.sink(receiveCompletion: { (completion) in
print("I'm done: \(completion)")
}, receiveValue: { dataModels in
for model in dataModels {
print("\(model.id) \(model.type)")
}
promise(.success(dataModels))
})
.store(in: &strongSelf.cancellableSet)
}
}
}
I wonder why it doesn't work if I use ViewModel?
Post
Replies
Boosts
Views
Activity
I've removed the comment.
override func viewDidLoad() {
super.viewDidLoad()
let text = "1:47PM"
if let regularFont = UIFont(name: "Helvetica", size: 20.0), let subscriptFont = UIFont(name: "TamilSangamMN", size: 12.0) {
let attString:NSMutableAttributedString = NSMutableAttributedString(string: text, attributes: [.font: regularFont])
attString.setAttributes([.font: subscriptFont, .baselineOffset: 6], range: NSRange(location: text.count - 2, length: 2))
label.attributedText = attString
}
}
You should start by reading the Swift Programming Language.
Call them up?
Don't you have something else to have fun?
Are you having fun?
I guess it goes like the following.
Publishers.CombineLatest4($variable0, $variable1, $variable2, $variable3)
.combineLatest($variable4)
.combineLatest($variable5)
.sink { completion in
} receiveValue: { response0, response1 in
let variable = response0.0
let variable4 = response0.1
let variable5 = response1
let v0 = variable.0
let v1 = variable.1
let v2 = variable.2
let v3 = variable.3
}.store(in: &cancellables)
It's kind of odd.
I thought
let publishers = Publishers.CombineLatest4($variable0, $variable1, $variable2, $variable3) .combineLatest($variable4) .combineLatest($variable5)
could work. But it doesn't.
Actually, no...
Maybe, subscribing to an array of them?
It depends on the purpose of your app. After a trial period, if the app has no features to use, then it will be rejected for sure.
To my knowledge, Apple Pay is not a payment processing service system. It's a mediator or a digital wallet that stores privacy data and allows the user to make a payment through a third-party processing system. So the answer to your question is no, I suppose.
Go to Apple Developer and click on Membership after signing in.
Okay... The solution to my question is use of the Future guy.
class APIClient: NSObject {
var cancellables = [AnyCancellable]()
@Published var models = [MyModel]()
func fetchData(urlStr: String) -> Future<[MyModel], Error> {
return Future<[MyModel], Error> { [weak self] promise in
guard let url = URL(string: urlStr) else {
return promise(.failure("Failure" as! Error))
}
guard let strongSelf = self else { return }
URLSession.shared.dataTaskPublisher(for: url)
.map { $0.data }
.decode(type: [MyModel].self, decoder: JSONDecoder())
.replaceError(with: [])
.sink { completion in
if case .failure(let error) = completion {
promise(.failure(error))
}
} receiveValue: { promise(.success($0)) }
.store(in: &strongSelf.cancellables)
}
}
}
class ViewModel: NSObject {
@IBOutlet var apiClient: APIClient!
var cancellables = Set<AnyCancellable>()
@Published var dataModels = [MyModel]()
func getGitData() -> Future<[MyModel], Error> {
let urlStr = "https://api.github.com/repos/ReactiveX/RxSwift/events"
return Future<[MyModel], Error> { [weak self] promise in
guard let strongSelf = self else { return }
strongSelf.apiClient.fetchData(urlStr: urlStr)
.sink { completion in
if case .failure(let error) = completion {
promise(.failure(error))
}
} receiveValue: {
promise(.success($0))
print("view model: \($0.count)")
}
.store(in: &strongSelf.cancellables)
}
}
}