Skip to content

Commit

Permalink
add multipart tweet loading
Browse files Browse the repository at this point in the history
  • Loading branch information
felixakiragreen committed Oct 2, 2022
1 parent e6ee03f commit be83365
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 6 deletions.
Binary file not shown.
49 changes: 43 additions & 6 deletions VisaViz/VisaViz/Model/TweetArchiveStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ class TweetArchiveStore: ObservableObject {

try await loadAccount()

try await loadTweets()
try await loadAllTweets()

isLoaded = true
}
Expand All @@ -109,18 +109,39 @@ class TweetArchiveStore: ObservableObject {
// Tweets (data/tweet.js)
//

func loadTweets() async throws {
guard archivePath != nil else {
func loadAllTweets() async throws {
guard let archivePath else {
throw ArchiveError.archivePathNotFound
}

let url = try tweetURL(path: archivePath!)
let url = try tweetURL(path: archivePath)

print("url", url)

let (data, _) = try await URLSession.shared.data(from: url)
try await loadTweets(url: url)

var i = 1
while let partUrl = tweetPartitionedURL(path: archivePath, part: i), i < 20 {
print("partUrl", partUrl)
do {
try await loadTweets(url: partUrl)
i += 1
} catch {
break
}
}

// sort all at the end
allTweets = allTweets.sorted(by: { $0.createdAt < $1.createdAt })
}

func loadTweets(url: URL) async throws {
print("loadTweets:", url)

let (data, _) = try await URLSession.shared.data(from: url)
let decodedData = try await decodeTweetData(data: data)

allTweets = decodedData.sorted(by: { $0.createdAt < $1.createdAt })
allTweets.append(contentsOf: decodedData)
}

private func tweetURL(path: URL) throws -> URL {
Expand All @@ -130,6 +151,22 @@ class TweetArchiveStore: ObservableObject {

return url
}

private func tweetPartitionedURL(path: URL, part: Int) throws -> URL {
guard let url = URL(string: "data/tweet-part\(part).js", relativeTo: path) else {
throw ArchiveError.createURLFailure
}

return url
}

private func tweetPartitionedURL(path: URL, part: Int) -> URL? {
guard let url = URL(string: "data/tweet-part\(part).js", relativeTo: path) else {
return nil
}

return url
}

private func decodeTweetData(data: Data) async throws -> [Tweet] {
let string = String(decoding: data, as: UTF8.self)
Expand Down

0 comments on commit be83365

Please sign in to comment.