初学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 框架,上面有一些例子: