Skip to content

Instantly share code, notes, and snippets.

@ashtonmeuser
Last active October 3, 2018 00:19
Show Gist options
  • Select an option

  • Save ashtonmeuser/9cf2affd5705df1729ec00e73f4910f1 to your computer and use it in GitHub Desktop.

Select an option

Save ashtonmeuser/9cf2affd5705df1729ec00e73f4910f1 to your computer and use it in GitHub Desktop.
// Lambda helper class
final class LambdaHelper {
// AWS config constants, etc.
private let lambdaInvoker: AWSLambdaInvoker!
static let sharedInstance = LambdaHelper()
private init() {
// Set up AWS config, etc.
lambdaInvoker = AWSLambdaInvoker.default()
}
func search(query: String) {
let dictionary: [String: Any?] = ["query": query]
return Single<[TrackInfo]>.create { single in
self.lambdaInvoker.invokeFunction("fake_arn", jsonObject: dictionary) { (response, error) in
// Response is a JSON Foundation object, so cast to JSON data
guard error == nil,
let json = try? JSONSerialization.data(withJSONObject: response),
let results = try? JSONDecoder().decode([TrackInfo].self, from: response) else {
return single(.error(error ?? LambdaError.invalidResponse))
}
single(.success(results))
}
return Disposables.create()
}
}
}
// ViewModel
final class SearchViewModel {
// Error driver omitted in this example
var results: Driver<[TrackInfo]>
init(lambdaHelper: LambdaHelper, queryTextObservable: Observable<String>) {
results = queryTextObservable
.distinctUntilChanged()
.flatMap { query in
return lambdaHelper.search(query).asObservable().materialize()
}
.elements()
.asDriver(onErrorJustReturn: [])
}
}
// View
class SearchViewController: UIViewController {
// UITextField, etc.
private let lambdaHelper = LambdaHelper.sharedInstance
private let disposeBag = DisposeBag()
private var viewModel: SearchViewModel?
override func viewDidLoad() {
super.viewDidLoad()
viewModel = SearchViewModel(
lambdaHelper: lambdaHelper,
queryTextObservable: searchField.rx.text.orEmpty.asObservable(),
)
// VM results are to be used to drive a table view; for now, just subscribe
viewModel?.results.asObservable().subscribe({ (event) in
print(event)
})
.disposed(by: disposeBag)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment