初学iOS,在做搜索功能的时候遇到了这个问题。做的是一个商品类应用,在用户搜索商品时,目前打算把所有商品名一次性在初始化时获取,然后再搜索。但是如果商品数量很大,我觉得这样不现实。请问一般搜索功能前后端数据是如何交互的呢?有哪些思路?
走同样的路,发现不同的人生
两种实现方式,如果很条目很少且稳定,就按你这样的获取,减少流量,加快搜索速度。通常是,传搜索内容到后端,后端返回搜索后的结果。
通常是用HTTPRequest(NSURL,NSURLConnection,NSURLSession等系统自带的方法,或者AFNetworking等第三方库)发送一个get或者post请求到服务器,里面包含了你想检索的信息,例如商品类型,颜色,价格等等,通常是以JSON形式。然后等待服务器返回搜索结果,一般也是以JSON的格式,然后从服务器得到的内容作为结果展示出来。
如果是一个枚举类型的数据, 选项有限,当然就是都放在客户端,然后来检索。
如果像你说的,是商品,而且数量很大,那就只能放到服务器来做检索了,用户输入完关键词,点搜索,则把关键词发送到服务器,服务器返回检索结果列表,客户端收到后,显示出来。
另外还有一种比较浪费流量一点,但是用户体验会更好:就是用户一边输入,一边发送关键词到服务器来检索,并显示检索结果, 随着用户输入的内容的变化,检索结果跟着变化。可以去看看 ReactiveCocoa 框架,上面有一些示例:
let searchStrings = textField.rac_textSignal() .toSignalProducer() .map { text in text as! String } .throttle(0.5, onScheduler: QueueScheduler.mainQueueScheduler) let searchResults = searchStrings .flatMap(.Latest) { (query: String) -> SignalProducer<(NSData, NSURLResponse), NSError> in let URLRequest = self.searchRequestWithEscapedQuery(query) return NSURLSession.sharedSession() .rac_dataWithRequest(URLRequest) .retry(2) .flatMapError { error in print("Network error occurred: \(error)") return SignalProducer.empty } } .map { (data, URLResponse) -> String in let string = String(data: data, encoding: NSUTF8StringEncoding)! return self.parseJSONResultsFromString(string) } .observeOn(UIScheduler())
两种实现方式,如果很条目很少且稳定,就按你这样的获取,减少流量,加快搜索速度。
通常是,传搜索内容到后端,后端返回搜索后的结果。
通常是用HTTPRequest(NSURL,NSURLConnection,NSURLSession等系统自带的方法,或者AFNetworking等第三方库)发送一个get或者post请求到服务器,里面包含了你想检索的信息,例如商品类型,颜色,价格等等,通常是以JSON形式。然后等待服务器返回搜索结果,一般也是以JSON的格式,然后从服务器得到的内容作为结果展示出来。
如果是一个枚举类型的数据, 选项有限,当然就是都放在客户端,然后来检索。
如果像你说的,是商品,而且数量很大,那就只能放到服务器来做检索了,用户输入完关键词,点搜索,则把关键词发送到服务器,服务器返回检索结果列表,客户端收到后,显示出来。
另外还有一种比较浪费流量一点,但是用户体验会更好:就是用户一边输入,一边发送关键词到服务器来检索,并显示检索结果, 随着用户输入的内容的变化,检索结果跟着变化。可以去看看 ReactiveCocoa 框架,上面有一些示例: