QueryRuleCustomData
About this widget # A
The QueryRuleCustomData
widget displays custom data from Rules.
You may want to use this widget to display banners or recommendations returned by Rules, and that match search parameters.
Examples # A
Instantiate a QueryRuleCustomDataConnector
and launch an initial search on its Searcher
triggering a Rule that returns custom data.
1
2
3
4
5
6
7
8
let searcher = HitsSearcher(appID: "AJ0P3S7DWQ",
apiKey: "90dfaaf5755e694f341fe68f6e41a6d4",
indexName: "YourIndexName")
let bannerViewController = BannerViewController()
let queryRuleCustomDataConnector = QueryRuleCustomDataConnector<Banner>(searcher: searcher,
controller: bannerViewController)
searcher.search()
Parameters # A
searcher
# |
type: HitsSearcher
Required
The |
interactor
# |
type: QueryRuleCustomDataInteractor<Model>
default: .init()
Required
The logic applied to the custom model. |
controller
# |
type: ItemController
default: nil
Optional
The Controller interfacing with a concrete custom data view. |
presenter
# |
type: Presenter<SearchStats?, Output>
default: nil
Optional
The Presenter defining how a model appears in the controller. |
Low-level API# A
If you want to fully control the QueryRuleCustomData
components and connect them manually, you can use the following components:
Searcher
: TheSearcher
that handles your searches.QueryRuleCustomDataInteractor
: The logic applied to the custom model.ItemController
: The Controller interfacing with a concrete custom data view.
1
2
3
4
5
6
7
8
let searcher = HitsSearcher(appID: "AJ0P3S7DWQ",
apiKey: "90dfaaf5755e694f341fe68f6e41a6d4",
indexName: "YourIndexName")
let queryRuleCustomDataInteractor: QueryRuleCustomDataInteractor<Banner> = .init()
let bannerViewController: BannerViewController = .init()
queryRuleCustomDataInteractor.connectSearcher(searcher)
queryRuleCustomDataInteractor.connectController(bannerViewController)
Customizing your view# A
If you want to use a third-party input view, or you want to introduce some custom behavior to the already provided UIKit component, you can create your own controller conforming to the ItemController
protocol.
Protocol#
func setItem(_ item: String?)
:
Function called when new metadata are received.
Example#
Let’s assume your custom JSON data contains a banner URL that can be decoded to the following structure:
1
2
3
struct Banner: Decodable {
let bannerURL: URL
}
You could implement the BannerViewController
presenting the banner image as follows:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class BannerViewController: UIViewController, ItemController {
let bannerView: UIImageView = .init()
override func viewDidLoad() {
super.viewDidLoad()
// some setup layout code
}
func setItem(_ item: Banner?) {
guard let bannerURL = item?.bannerURL else {
bannerView.image = nil
return
}
URLSession.shared.dataTask(with: bannerURL) { (data, _, _) in
self.bannerView.image = data.flatMap(UIImage.init)
}.resume()
}
}
SwiftUI#
To create a rule custom data view with SwiftUI start with implementation of the ItemController
containing your custom model as a published property.
1
2
3
4
5
6
7
8
9
class BannerObservableController: ObservableObject, ItemController {
@Published var banner: Banner?
func setItem(_ item: Banner?) {
self.banner = item
}
}
Then connect this controller to the QueryRuleCustomDataConnector
or QueryRuleCustomDataInteractor
and build a SwiftUI view presenting the fetched custom model.
1
2
3
4
5
6
7
8
9
10
11
struct ContentView: View {
@ObservedObject var bannerController: BannerObservableController
var body: some View {
if let bannerURL = bannerController.banner?.bannerURL {
// present a banner using the fetched URL
}
}
}
Check out the example to see this widget in action.