Skip to content

Commit db94bbc

Browse files
insub4067yeniful
andauthored
v2.0.3 (#90)
* [Refactoring] SDWebImageSwiftUI, Combine 추가 (#91) * [Refactor] Network 통신 에 dataTaskPublisher 적용 * [Refactor] var -> let 으로 변경 * [Refactor] AsyncImage -> SDWebImageSwiftUI WebImage 로 변경 * [Refactor] weak self 추가 * [Refacto] weak self 추가 * [Feat] Widget (#89) * [Feat] Widget * Merge branch 'develop' into Widget * [Feat] Ticketing 탭 -> 기존 Navigation 에서 Browser 로 이동 (#92) * [Feat] Ticketing 탭 -> 기존 Navigation 에 Browser 로 이동 * [Refactor] 코드 줄 다이어트 * App Version --------- Co-authored-by: yeni <[email protected]>
1 parent eb4746e commit db94bbc

File tree

20 files changed

+560
-172
lines changed

20 files changed

+560
-172
lines changed

AsyncSwift.xcodeproj/project.pbxproj

Lines changed: 235 additions & 7 deletions
Large diffs are not rendered by default.

AsyncSwift.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 45 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

AsyncSwift/AsyncSwift.entitlements

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,9 @@
88
<array>
99
<string>applinks:asyncswift.info</string>
1010
</array>
11+
<key>com.apple.security.application-groups</key>
12+
<array>
13+
<string>group.com.kim.AsyncSwift</string>
14+
</array>
1115
</dict>
1216
</plist>

AsyncSwift/Observed/EventDetailView+Observed.swift

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,27 @@ import EventKit
99
import SwiftUI
1010

1111
extension EventDetailView {
12+
1213
final class Observed: ObservableObject {
1314

1415
init(event: Event) {
1516
self.event = event
1617
}
1718

18-
@Published var event: Event
19+
let event: Event
1920
@Published var isShowingSheet = false
2021
@Published var isShowingAddEventConfirmationAlert = false
2122
@Published var isShowingAddEventSuccessAlert = false
2223
@Published var isShowingAddEventFailureAlert = false
2324

2425
func additionConfirmed() {
25-
addEventOnCalendar { isSuccess in
26-
DispatchQueue.main.async { [weak self] in
27-
if let self = self {
28-
switch isSuccess {
29-
case true:
30-
self.isShowingAddEventSuccessAlert = true
31-
case false:
32-
self.isShowingAddEventFailureAlert = true
33-
}
26+
addEventOnCalendar { [weak self] isSuccess in
27+
DispatchQueue.main.async {
28+
switch isSuccess {
29+
case true:
30+
self?.isShowingAddEventSuccessAlert = true
31+
case false:
32+
self?.isShowingAddEventFailureAlert = true
3433
}
3534
}
3635
}
@@ -39,11 +38,8 @@ extension EventDetailView {
3938
func addEventOnCalendar(completion: @escaping ((Bool) -> Void) ) {
4039
let eventStore = EKEventStore()
4140

42-
eventStore.requestAccess(to: .event) { (granted, error) in
43-
if let error = error {
44-
print("failed to save event with error : \(error) or access not granted")
45-
return
46-
}
41+
eventStore.requestAccess(to: .event) { [weak self] (granted, error) in
42+
guard let self, error == nil else { return }
4743
let event = EKEvent(eventStore: eventStore)
4844
let formatter = DateFormatter.calendarFormatter
4945
event.title = self.event.title

AsyncSwift/Observed/EventView+Observed.swift

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,31 @@
66
//
77

88
import SwiftUI
9+
import Combine
910

1011
final class EventViewObserved: ObservableObject {
1112

1213
@Published var event = Event()
1314
@Published var eventStatus: EventStatus = .upcoming
1415
@Published var isLoading = true
1516
let onLoadingCells = Array(repeating: [0], count: 6)
16-
17-
init() {
18-
self.fetchJson {
19-
self.calculateEventStatus()
20-
self.isLoading = false
21-
}
22-
}
23-
24-
func fetchJson(completion: @escaping () -> Void) {
25-
guard let url = URL(string: "https://async-swift.github.io/jsonstorage/asyncswift.json") else { return }
26-
let request = URLRequest(url: url)
27-
let dataTask = URLSession.shared.dataTask(with: request) { data, response, _ in
28-
guard
29-
let response = response as? HTTPURLResponse,
30-
response.statusCode == 200,
31-
let data = data
32-
else { return }
33-
DispatchQueue.main.async { [weak self] in
34-
guard let self = self else { return }
35-
do {
36-
let decodedData = try JSONDecoder().decode(Event.self, from: data)
37-
self.event = decodedData
38-
completion()
39-
} catch let error {
40-
print("\(error.localizedDescription)")
41-
}
42-
}
43-
}
44-
dataTask.resume()
17+
var cancellable = Set<AnyCancellable>()
18+
19+
func getEventData() {
20+
let urlString = "https://async-swift.github.io/jsonstorage/asyncswift.json"
21+
let url = URL(string: urlString)!
22+
URLSession.shared.dataTaskPublisher(for: url)
23+
.map(\.data)
24+
.decode(type: Event.self, decoder: JSONDecoder())
25+
.receive(on: RunLoop.main)
26+
.sink { _ in
27+
28+
} receiveValue: { [weak self] event in
29+
self?.event = event
30+
self?.calculateEventStatus()
31+
self?.isLoading = false
32+
}
33+
.store(in: &cancellable)
4534
}
4635

4736
func calculateEventStatus() {

AsyncSwift/Observed/SessionView+Observed.swift

Lines changed: 0 additions & 20 deletions
This file was deleted.

AsyncSwift/Observed/StampView+Observed.swift

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@
66
//
77

88
import SwiftUI
9+
import Combine
910

1011
extension StampView {
11-
@MainActor final class Observed: ObservableObject {
12+
final class Observed: ObservableObject {
1213
@Published var cards: [Card] = []
1314
@Published var events = [String]()
1415
@Published var currentIndex = 0
1516
@Published var isLoading = true
1617
private let keyChainManager = KeyChainManager()
1718
private let cardInterval: CGFloat = (UIScreen.main.bounds.width - 32) * 56 / 358
1819
private let cardSize: CGFloat = UIScreen.main.bounds.width - 32
20+
private var cancenllable = Set<AnyCancellable>()
1921

2022
init() {
2123
fetchStampsImages()
@@ -30,38 +32,41 @@ extension StampView {
3032

3133
/// Storage에 저장되어 있는 Stamp Image를 가져오는 함수이다.
3234
/// -
33-
private func fetchStampsImages(){
35+
private func fetchStampsImages() {
36+
3437
let events = getEvents()
35-
36-
guard !events.isEmpty else {
37-
isLoading = false
38-
return
39-
}
40-
38+
guard !events.isEmpty else { return isLoading = false }
39+
4140
events.enumerated().forEach { [weak self] in
4241
guard let self else { return }
4342
let event = $0.element
4443
let index = $0.offset
45-
Task { @MainActor () -> Void in
46-
guard let cardImageURL = URL(string: "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/Images/Stamp/" + event + "/stamp.png")
47-
else { return }
48-
49-
let cardImageRequest = URLRequest(url: cardImageURL)
50-
let (cardImageData, cardImageResponse) = try await URLSession.shared.data(for: cardImageRequest)
51-
guard let httpsResponse = cardImageResponse as? HTTPURLResponse, httpsResponse.statusCode == 200 else { return }
52-
53-
guard let cardUIImage = UIImage(data: cardImageData) else { return }
5444

55-
let card = Card(
56-
originalPosition: self.cardInterval * CGFloat(index),
57-
image: Image(uiImage: cardUIImage),
58-
event: event
59-
)
60-
self.cards.append(card)
61-
if index == events.count - 1 {
62-
self.isLoading = false
45+
let urlString = "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/Images/Stamp/" + event + "/stamp.png"
46+
let url = URL(string: urlString)!
47+
48+
URLSession.shared.dataTaskPublisher(for: url)
49+
.map(\.data)
50+
.tryMap {
51+
guard let image = UIImage(data: $0) else {
52+
throw URLError(.badURL)
53+
}
54+
return Card(
55+
originalPosition: self.cardInterval * CGFloat(index),
56+
image: Image(uiImage: image),
57+
event: event
58+
)
6359
}
64-
}
60+
.receive(on: RunLoop.main)
61+
.sink(receiveCompletion: { _ in
62+
63+
}, receiveValue: { [weak self] card in
64+
self?.cards.append(card)
65+
if index == events.count - 1 {
66+
self?.isLoading = false
67+
}
68+
})
69+
.store(in: &cancenllable)
6570
}
6671
}
6772

AsyncSwift/Observed/TicketingView+Observed.swift

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import Foundation
1111
extension TicketingView {
1212
final class Observed: ObservableObject {
1313
@Published var ticketing: Ticketing?
14-
1514
@Published var isActivatedWebViewNavigationLink = false
15+
var cancellable = Set<AnyCancellable>()
1616

1717
var hasAvailableTicket: Bool {
1818
let currentDate = Date()
@@ -22,32 +22,20 @@ extension TicketingView {
2222
var isTicketingLinkDisabled: Bool {
2323
ticketing?.currentTicket?.ticketingURL == nil && !hasAvailableTicket
2424
}
25-
26-
func onAppear() {
27-
guard
28-
let url = URL(string: "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/ticketing.json")
29-
else { return }
30-
31-
32-
let request = URLRequest(url: url)
33-
let dataTask = URLSession.shared.dataTask(with: request) { data, response, _ in
34-
guard
35-
let response = response as? HTTPURLResponse,
36-
response.statusCode == 200,
37-
let data = data
38-
else { return }
39-
40-
DispatchQueue.main.async { [weak self] in
41-
do {
42-
let ticketing = try JSONDecoder().decode(Ticketing.self, from: data)
43-
self?.ticketing = ticketing
44-
} catch {
45-
self?.ticketing = nil
46-
}
47-
}
48-
}
49-
50-
dataTask.resume()
25+
26+
func getTicketingData() {
27+
let urlString = "https://raw.githubusercontent.com/Async-Swift/jsonstorage/main/ticketing.json"
28+
let url = URL(string: urlString)!
29+
URLSession.shared.dataTaskPublisher(for: url)
30+
.map(\.data)
31+
.decode(type: Ticketing.self, decoder: JSONDecoder())
32+
.receive(on: RunLoop.main)
33+
.sink { _ in
34+
35+
} receiveValue: { [weak self] event in
36+
self?.ticketing = event
37+
}
38+
.store(in: &cancellable)
5139
}
5240

5341
func didTappedTicketingButton() {

AsyncSwift/Views/EventView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct EventView: View {
3333
}
3434
}
3535
.navigationTitle(Tab.event.title)
36+
.onAppear { observed.getEventData() }
3637
}
3738
}
3839
}

0 commit comments

Comments
 (0)