Skip to content

Commit 3b0d108

Browse files
Merge pull request #166 from nextcloud/ios-15-fix
fix-ios-15
2 parents 64aebff + f0e4f40 commit 3b0d108

6 files changed

Lines changed: 17 additions & 91 deletions

File tree

Sources/NextcloudKit/NKCommon.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,6 @@ public struct NKCommon: Sendable {
7878
public let groupDefaultsUnavailable = "Unavailable"
7979
public let groupDefaultsToS = "ToS"
8080

81-
82-
8381
// MARK: - Init
8482

8583
init() { }
@@ -200,11 +198,11 @@ public struct NKCommon: Sendable {
200198

201199
// MARK: - Server Error GroupDefaults
202200

203-
public func appendServerErrorAccount(_ account: String, errorCode: Int) {
201+
public func appendServerErrorAccount(_ account: String, errorCode: Int) async {
204202
guard let groupDefaults = UserDefaults(suiteName: groupIdentifier) else {
205203
return
206204
}
207-
let capabilities = NKCapabilities.shared.getCapabilitiesBlocking(for: account)
205+
let capabilities = await NKCapabilities.shared.getCapabilities(for: account)
208206

209207
/// Unavailable
210208
if errorCode == 503 {
@@ -239,8 +237,6 @@ public struct NKCommon: Sendable {
239237
return "\(identifier).\(account)"
240238
}
241239

242-
243-
244240
public func getStandardHeaders(account: String, options: NKRequestOptions? = nil) -> HTTPHeaders? {
245241
guard let session = nksessions.session(forAccount: account) else {
246242
return nil

Sources/NextcloudKit/NKMonitor.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ final class NKMonitor: EventMonitor, Sendable {
4141
let headerCheckInterceptor = request.request?.allHTTPHeaderFields?[nkCommonInstance.headerCheckInterceptor],
4242
headerCheckInterceptor.lowercased() == "true",
4343
let account = request.request?.allHTTPHeaderFields?[nkCommonInstance.headerAccount] {
44-
nkCommonInstance.appendServerErrorAccount(account, errorCode: statusCode)
44+
Task {
45+
await nkCommonInstance.appendServerErrorAccount(account, errorCode: statusCode)
46+
}
4547
}
4648

4749
DispatchQueue.global(qos: .utility).async {

Sources/NextcloudKit/NextcloudKit+Capabilities.swift

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ public extension NextcloudKit {
410410
capabilities.termsOfService = json.termsOfService?.enabled ?? false
411411

412412
// Persist capabilities in shared store
413-
await NKCapabilities.shared.appendCapabilitiesAsync(for: account, capabilities: capabilities)
413+
await NKCapabilities.shared.setCapabilities(for: account, capabilities: capabilities)
414414
return capabilities
415415
} catch {
416416
nkLog(error: "Could not decode json capabilities: \(error.localizedDescription)")
@@ -490,49 +490,14 @@ final public class NKCapabilities: Sendable {
490490

491491
// MARK: - Public API
492492

493-
public func appendCapabilitiesAsync(for account: String, capabilities: Capabilities) async {
493+
public func setCapabilities(for account: String, capabilities: Capabilities) async {
494494
await store.set(account, value: capabilities)
495495
}
496496

497-
/// Synchronously stores capabilities for the given account.
498-
/// Blocks the current thread until the async actor completes.
499-
/// Use only outside of async/actor contexts.
500-
public func appendCapabilitiesBlocking(for account: String, capabilities: Capabilities) {
501-
let group = DispatchGroup()
502-
503-
group.enter()
504-
Task.detached(priority: .userInitiated) {
505-
await self.store.set(account, value: capabilities)
506-
group.leave()
507-
}
508-
509-
group.wait()
510-
}
511-
512-
public func getCapabilitiesAsync(for account: String?) async -> Capabilities {
497+
public func getCapabilities(for account: String?) async -> Capabilities {
513498
guard let account else {
514499
return Capabilities()
515500
}
516501
return await store.get(account) ?? Capabilities()
517502
}
518-
519-
/// Synchronously retrieves capabilities for the given account.
520-
/// Blocks the current thread until the async actor returns.
521-
/// Use only outside the Swift async context (never from another actor or async function).
522-
public func getCapabilitiesBlocking(for account: String?) -> Capabilities {
523-
guard let account else {
524-
return Capabilities()
525-
}
526-
let group = DispatchGroup()
527-
var result: Capabilities?
528-
529-
group.enter()
530-
Task.detached(priority: .userInitiated) {
531-
result = await self.store.get(account)
532-
group.leave()
533-
}
534-
535-
group.wait()
536-
return result ?? Capabilities()
537-
}
538503
}

Sources/NextcloudKit/NextcloudKit+NCText.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ public extension NextcloudKit {
3737
Task {
3838
do {
3939
let (editors, creators) = try NKEditorDetailsConverter.from(data: responseData)
40-
let capabilities = await NKCapabilities.shared.getCapabilitiesAsync(for: account)
40+
let capabilities = await NKCapabilities.shared.getCapabilities(for: account)
4141
capabilities.directEditingEditors = editors
4242
capabilities.directEditingCreators = creators
43-
await NKCapabilities.shared.appendCapabilitiesAsync(for: account, capabilities: capabilities)
43+
await NKCapabilities.shared.setCapabilities(for: account, capabilities: capabilities)
4444

4545
options.queue.async {
4646
completion(account, editors, creators, response, .success)
@@ -206,10 +206,10 @@ public extension NextcloudKit {
206206
let decoded = try JSONDecoder().decode(NKEditorTemplateResponse.self, from: data)
207207
let templates = decoded.ocs.data.editors
208208
// Update capabilities
209-
let capabilities = await NKCapabilities.shared.getCapabilitiesAsync(for: account)
209+
let capabilities = await NKCapabilities.shared.getCapabilities(for: account)
210210
capabilities.directEditingTemplates = templates
211-
await NKCapabilities.shared.appendCapabilitiesAsync(for: account, capabilities: capabilities)
212-
211+
await NKCapabilities.shared.setCapabilities(for: account, capabilities: capabilities)
212+
213213
options.queue.async { completion(account, templates, response, .success) }
214214
} catch {
215215
nkLog(error: "Failed to decode template list: \(error)")

Sources/NextcloudKit/TypeIdentifiers/NKFilePropertyResolver.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ public final class NKFilePropertyResolver {
4444

4545
public init() {}
4646

47-
public func resolve(inUTI: String, account: String) -> NKFileProperty {
47+
public func resolve(inUTI: String, account: String) async -> NKFileProperty {
4848
let fileProperty = NKFileProperty()
4949
let typeIdentifier = inUTI as String
50-
let capabilities = NKCapabilities.shared.getCapabilitiesBlocking(for: account)
50+
let capabilities = await NKCapabilities.shared.getCapabilities(for: account)
5151
let utiString = inUTI as String
5252

5353
// Preferred extension

Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ public actor NKTypeIdentifiers {
2626
private init() {}
2727

2828
// Resolves type info from file name and optional MIME type
29-
public func getInternalType(fileName: String, mimeType inputMimeType: String, directory: Bool, account: String) -> NKTypeIdentifierCache {
30-
29+
public func getInternalType(fileName: String, mimeType inputMimeType: String, directory: Bool, account: String) async -> NKTypeIdentifierCache {
3130
var ext = (fileName as NSString).pathExtension.lowercased()
3231
var mimeType = inputMimeType
3332
var classFile = ""
@@ -63,7 +62,7 @@ public actor NKTypeIdentifiers {
6362
fileNameWithoutExt = fileName
6463
ext = ""
6564
} else {
66-
let props = resolver.resolve(inUTI: typeIdentifier, account: account)
65+
let props = await resolver.resolve(inUTI: typeIdentifier, account: account)
6766
classFile = props.classFile.rawValue
6867
iconName = props.iconName.rawValue
6968
}
@@ -91,39 +90,3 @@ public actor NKTypeIdentifiers {
9190
filePropertyCache.removeAll()
9291
}
9392
}
94-
95-
/// Helper class to access NKTypeIdentifiers from sync contexts (e.g. in legacy code or libraries).
96-
public final class NKTypeIdentifiersHelper {
97-
public static let shared = NKTypeIdentifiersHelper()
98-
99-
// Internal actor reference (uses NKTypeIdentifiers.shared by default)
100-
private let actor: NKTypeIdentifiers
101-
102-
private init() {
103-
self.actor = .shared
104-
}
105-
106-
// Init with optional custom actor (useful for testing)
107-
public init(actor: NKTypeIdentifiers = .shared) {
108-
self.actor = actor
109-
}
110-
111-
// Synchronously resolves file type info by calling the async actor inside a semaphore block.
112-
public func getInternalTypeSync(fileName: String, mimeType: String, directory: Bool, account: String) -> NKTypeIdentifierCache {
113-
var result: NKTypeIdentifierCache?
114-
let semaphore = DispatchSemaphore(value: 0)
115-
116-
Task {
117-
result = await actor.getInternalType(
118-
fileName: fileName,
119-
mimeType: mimeType,
120-
directory: directory,
121-
account: account
122-
)
123-
semaphore.signal()
124-
}
125-
126-
semaphore.wait()
127-
return result!
128-
}
129-
}

0 commit comments

Comments
 (0)