This is the basic example for the Flickr image search module. Its will search any keyword based on your keyword and it will display the images with the endless scrolling.
Inside this project UISearchBar using for type keywords and UICollectionView for display search results. It will call request async and display new images based on page count in backgroud simuntaniously.
- Clone the repo and run Flickr-Search.xcodeproj
- No pod install or carthage update needed directly use this projects
- Create a Flickr API key and replace in line number 15 flickrKey with your own key in Router.swift
- Deployment target of your App is >= iOS 10.0
- XCode 9.3 or later
- Swift 4.0
Images are retrieved by hitting the Flickr API.
- Search Path:
https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=YOUR_FLICKR_API_KEY&format=json&nojsoncallback=1&safe_search=1&text=KEYWORD
- Response includes an array of photo objects, each represented as:
{
"id": "23451156376",
"owner": "28017113@N08",
"secret": "8983a8ebc7",
"server": "578",
"farm": 1,
"title": "Merry Christmas!",
"ispublic": 1,
"isfriend": 0,
"isfamily": 0
}
http://farm{farm}.static.flickr.com/{server}/{id}_{secret}.jpg
http://farm1.static.flickr.com/578/23451156376_8983a8ebc7.jpg
https://www.flickr.com/services/api/misc.api_keys.html
UISearchBar priving for keyword search access.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
searchBar.resignFirstResponder()
//Reset old data first befor new search Results
resetValuesForNewSearch()
//Requesting here new keyword
fetchSearchImages()
}
For providing infinite scroll using here UIScrollView Delegate method it will calculate size which required for pagination new data model
//MARK :- Getting user scroll down event here
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView == collectionResult{
if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= (scrollView.contentSize.height)){
//Start locading new data from here
fetchSearchImages()
}
}
}
- Collection View with flowlayout
- Image Cache
router.requestFor(text: searchBar.text ?? "", with: pageCount.description, decode: { json -> Photos? in
guard let flickerResult = json as? Photos else { return nil }
return flickerResult
}) { [unowned self] result in
self.labelLoading.text = ""
switch result{
case .success(let value):
self.updateSearchResult(with: value.photos.photo, nil)
case .failure(let error):
print(error.debugDescription)
self.showAlertWithError((error?.localizedDescription) ??
"Please check your Internet connection or try again.", completionHandler: {[unowned self] status in
guard status else { return }
self.fetchSearchImages()
})
}
}
Anscoder (Anand Nimje)