Skip to content
This repository has been archived by the owner on Aug 27, 2023. It is now read-only.

Commit

Permalink
Add a convenience method to request only one random article at a time.
Browse files Browse the repository at this point in the history
  • Loading branch information
frankrausch committed Jun 17, 2017
1 parent 2ef44d2 commit a6e65b8
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 0 deletions.
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,37 @@ Caching happens automatically (*after* processing and formatting) for search res
There’s also the automatic [`NSURLCache`](http://nshipster.com/nsurlcache/), controlled by the server’s cache headers. You can modify the cache duration headers to be included API response in `Wikipedia.maxAgeInSeconds`.


## Random Articles

Request an array of random `WikipediaArticlePreview` objects like this:

```swift
Wikipedia.shared.requestRandomArticles(language: self.language, maxCount: 8, imageWidth: 640) {
(articlePreviews, language, error) in

guard let articlePreviews = articlePreviews else { return }

for article in articlePreviews {
print(article.displayTitle)
}
}
```

WikipediaKit also has this convenience function that gets only one single random `WikipediaArticlePreview` at a time:

```swift
Wikipedia.shared.requestSingleRandomArticle(language: self.language, maxCount: 8, imageWidth: 640) {
(article, language, error) in

guard let article = article else { return }

print(article.displayTitle)
}
```

If `maxCount` is larger than `1`, the surplus results from the API query are buffered in a shared `WikipediaRandomArticlesBuffer` object and will be returned one-by-one with every subsequent call of `requestSingleRandomArticle`. A new network request is only triggered when there are no buffered random articles left or when the query language changes.


## To Do

- [ ] Improve unit tests
Expand Down
30 changes: 30 additions & 0 deletions Sources/Wikipedia+RandomArticles.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,36 @@ import Foundation

extension Wikipedia {

public func requestSingleRandomArticle(language: WikipediaLanguage,
maxCount: Int = 1,
imageWidth: Int,
loadExtracts: Bool = false,
completion: @escaping (WikipediaArticlePreview?, WikipediaLanguage, WikipediaError?)-> ())
-> URLSessionDataTask? {
if WikipediaRandomArticlesBuffer.shared.language == language,
let nextArticlePreview = WikipediaRandomArticlesBuffer.shared.nextArticlePreview() {
completion(nextArticlePreview, language, nil)
return nil
} else {
return Wikipedia.shared.requestRandomArticles(language: language, maxCount: maxCount, imageWidth: imageWidth, loadExtracts: loadExtracts) { articlePreviews, language, error in

guard let articlePreviews = articlePreviews else {
DispatchQueue.main.async {
completion(nil, language, error)
}
return
}

WikipediaRandomArticlesBuffer.shared.articlePreviews = articlePreviews

let articlePreview = WikipediaRandomArticlesBuffer.shared.nextArticlePreview()
DispatchQueue.main.async {
completion(articlePreview, language, error)
}
}
}
}

public func requestRandomArticles(language: WikipediaLanguage,
maxCount: Int = 8,
imageWidth: Int,
Expand Down
46 changes: 46 additions & 0 deletions Sources/WikipediaRandomArticlesBuffer.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// WikipediaRandomArticlesBuffer.swift
// WikipediaKit
//
// Created by Frank Rausch on 2017-06-17
// Copyright © 2017 Raureif GmbH / Frank Rausch
//
// MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// “Software”), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//

import Foundation

class WikipediaRandomArticlesBuffer {

static var shared: WikipediaRandomArticlesBuffer = {
return WikipediaRandomArticlesBuffer()
}()

var articlePreviews = [WikipediaArticlePreview]()
var language = WikipediaLanguage("en")

func nextArticlePreview() -> WikipediaArticlePreview? {
let a = articlePreviews.first
self.articlePreviews = Array(self.articlePreviews.dropFirst())
return a
}
}
10 changes: 10 additions & 0 deletions WikipediaKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
276D66F01EE9939A007896DC /* Wikipedia+RandomArticles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2721FC321EE86F140025EC74 /* Wikipedia+RandomArticles.swift */; };
276D66F11EE9939B007896DC /* Wikipedia+RandomArticles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2721FC321EE86F140025EC74 /* Wikipedia+RandomArticles.swift */; };
276D66F21EE9939C007896DC /* Wikipedia+RandomArticles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2721FC321EE86F140025EC74 /* Wikipedia+RandomArticles.swift */; };
27C2AA1C1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C2AA1B1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift */; };
27C2AA1D1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C2AA1B1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift */; };
27C2AA1E1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C2AA1B1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift */; };
27C2AA1F1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C2AA1B1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift */; };
27DFDF821EB271F6005DFA7E /* WikipediaNetworkingActivityDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27DFDF811EB271F6005DFA7E /* WikipediaNetworkingActivityDelegate.swift */; };
27DFDF831EB27232005DFA7E /* WikipediaNetworkingActivityDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27DFDF811EB271F6005DFA7E /* WikipediaNetworkingActivityDelegate.swift */; };
27DFDF841EB27233005DFA7E /* WikipediaNetworkingActivityDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27DFDF811EB271F6005DFA7E /* WikipediaNetworkingActivityDelegate.swift */; };
Expand Down Expand Up @@ -138,6 +142,7 @@
275906061E8301F6000C3ACA /* WikipediaTextFormattingDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaTextFormattingDelegate.swift; sourceTree = "<group>"; };
2759060B1E830237000C3ACA /* WikipediaBlacklistDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaBlacklistDelegate.swift; sourceTree = "<group>"; };
2759060D1E83025B000C3ACA /* WikipediaNamespace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaNamespace.swift; sourceTree = "<group>"; };
27C2AA1B1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaRandomArticlesBuffer.swift; sourceTree = "<group>"; };
27DFDF811EB271F6005DFA7E /* WikipediaNetworkingActivityDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaNetworkingActivityDelegate.swift; sourceTree = "<group>"; };
27DFDF861EB4CC9C005DFA7E /* WikipediaTOCItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaTOCItem.swift; sourceTree = "<group>"; };
27E365081E81757500F39F78 /* WikipediaKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WikipediaKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -326,6 +331,7 @@
274EFCD21EB773200047428B /* WikipediaSearchMethod.swift */,
27E3651F1E81767000F39F78 /* WikipediaSearchResults.swift */,
27E365201E81767000F39F78 /* WikipediaSearchResultsCache.swift */,
27C2AA1B1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift */,
27DFDF861EB4CC9C005DFA7E /* WikipediaTOCItem.swift */,
);
name = Core;
Expand Down Expand Up @@ -588,6 +594,7 @@
27E3652A1E81767000F39F78 /* WikipediaLanguage.swift in Sources */,
27E3652B1E81767000F39F78 /* WikipediaNetworking.swift in Sources */,
27E365231E81767000F39F78 /* WikipediaArticleCache.swift in Sources */,
27C2AA1C1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */,
2759060E1E83025B000C3ACA /* WikipediaNamespace.swift in Sources */,
27E3652D1E81767000F39F78 /* WikipediaSearchResultsCache.swift in Sources */,
27E3653D1E8198A800F39F78 /* Wikipedia+Article.swift in Sources */,
Expand Down Expand Up @@ -621,6 +628,7 @@
27E365641E81AD5700F39F78 /* String+Wikipedia.swift in Sources */,
275906151E83026E000C3ACA /* WikipediaBlacklistDelegate.swift in Sources */,
27E365521E81AD5300F39F78 /* Wikipedia+Article.swift in Sources */,
27C2AA1D1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */,
2759060F1E830262000C3ACA /* WikipediaNamespace.swift in Sources */,
27E3655E1E81AD5300F39F78 /* WikipediaLanguage.swift in Sources */,
27E365561E81AD5300F39F78 /* Wikipedia+NearbySearch.swift in Sources */,
Expand Down Expand Up @@ -654,6 +662,7 @@
27E365A51E81C98400F39F78 /* String+Wikipedia.swift in Sources */,
275906131E83026D000C3ACA /* WikipediaBlacklistDelegate.swift in Sources */,
27E365991E81C98000F39F78 /* Wikipedia+Search.swift in Sources */,
27C2AA1E1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */,
275906101E830263000C3ACA /* WikipediaNamespace.swift in Sources */,
27E365981E81C98000F39F78 /* Wikipedia+NearbySearch.swift in Sources */,
27E365941E81C98000F39F78 /* Wikipedia+Article.swift in Sources */,
Expand Down Expand Up @@ -687,6 +696,7 @@
27E365C71E81C9F500F39F78 /* String+Wikipedia.swift in Sources */,
275906121E83026C000C3ACA /* WikipediaBlacklistDelegate.swift in Sources */,
27E365BB1E81C9F200F39F78 /* Wikipedia+Search.swift in Sources */,
27C2AA1F1EF5249600288BEA /* WikipediaRandomArticlesBuffer.swift in Sources */,
275906111E830263000C3ACA /* WikipediaNamespace.swift in Sources */,
27E365BA1E81C9F200F39F78 /* Wikipedia+NearbySearch.swift in Sources */,
27E365B61E81C9F200F39F78 /* Wikipedia+Article.swift in Sources */,
Expand Down

0 comments on commit a6e65b8

Please sign in to comment.