NowAttachmentService 클래스 - iOS
NowAttachmentService 클래스는 인스턴스의 테이블 내 기록 ServiceNow 과 연결된 첨부 파일을 업로드하고 쿼리할 수 있는 기능을 제공합니다.
각 요청과 함께 단일 파일을 업로드하거나 검색할 수 있습니다. NowAttachmentService 는 최대 파일 크기 및 허용되는 첨부 파일 형식과 같은 업로드된 파일에 대한 시스템 제한 사항을 준수합니다. 인스턴스 속성 com.glide.attachment.max_size(기본적으로 1024MB) 및 glide.attachment.extensions를 사용하여 이러한 설정을 제어할 수 있습니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 구성 | NowServiceConfiguration | 서비스가 초기화될 때 제공된 구성 설정입니다. |
NowAttachmentService - 첨부 파일(for sysId: String, validateAttachment: Boolean) 비동기 throws
지정된 sys_id 있는 첨부 파일을 검색하고 첨부 파일의 계산된 해시를 예상 SHA256 체크섬과 비교하여 첨부 파일을 확인합니다.
false로 설정하여 validateAttachment 유효성 검사 단계를 건너뛸 수 있습니다. 필요한 경우 Attachment.validate() 함수를 호출하여 이후 단계에서 첨부 파일의 유효성을 검사할 수 있습니다.| 이름 | 유형 | 설명 |
|---|---|---|
| sysId용 | 문자열 | 검색할 첨부 파일의 Sys_id입니다. |
| 첨부 파일 확인 | 부울 | 첨부 파일을 확인할지 여부를 나타내는 플래그입니다. 유효한 값은 다음과 같습니다.
기본값: true |
| 유형 | 설명 |
|---|---|
| NowAttachment | 메서드가 성공하면 반환됩니다. 지정된 첨부 파일입니다. |
| NowDataError | 메서드가 실패할 때 throw됩니다.
|
다음 코드 예제에서는 이 메서드를 호출하는 방법을 보여 줍니다.
func downloadAttachment(sysId: String) async throws -> NowAttachment {
do {
let nowAttachment = try await attachmentService.attachment(for: sysId, validateAttachment: false)
return nowAttachment
} catch {
// Handle NowDataError
throw error
}
}
NowAttachmentService - 첨부 파일(for sysId: String, validateAttachment: Boolean, completion: @escaping (Result<NowAttachment, NowDataError>))
지정된 sys_id 있는 첨부 파일을 검색하고 첨부 파일의 계산된 해시를 예상 SHA256 체크섬과 비교하여 첨부 파일을 확인합니다. 완료되면 전달된 완성 핸들러를 실행합니다.
false로 설정하여 validateAttachment 유효성 검사 단계를 건너뛸 수 있습니다. 필요한 경우 Attachment.validate() 함수를 호출하여 이후 단계에서 첨부 파일의 유효성을 검사할 수 있습니다.| 이름 | 유형 | 설명 |
|---|---|---|
| sysId용 | 문자열 | 검색할 첨부 파일의 Sys_id입니다. |
| 첨부 파일 확인 | 부울 | 첨부 파일을 확인할지 여부를 나타내는 플래그입니다. 유효한 값은 다음과 같습니다.
기본값: true |
| 완료 | @escaping(결과<NowAttachment, NowDataError>) | 첨부 파일을 검색한 후 실행할 완료 핸들러입니다. 완료 처리기에 대한 값 반환:
|
| 유형 | 설명 |
|---|---|
| 안 함 |
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let sysId = UUID().uuidString // UUID for the attachment
private func downloadAttachment(sysId: String) {
attachmentService.attachment(for: sysId, validateAttachment: false) { (result) in
switch result {
case .success(let attachment):
// Attachment retrieved successful, return attachment
case .failure(let error):
// Attachment retrieved failed, return NowDataError
}
}
}
NowAttachmentService - 첨부 파일(sysId의 경우: 문자열, validateAttachment: 부울)
지정된 sys_id 첨부 파일을 검색하고 첨부 파일의 계산된 해시를 예상 해시와 비교하여 첨부 파일을 확인합니다.
false로 설정하여 validateAttachment 유효성 검사 단계를 건너뛸 수 있습니다. 필요한 경우 Attachment.validate() 함수를 호출하여 이후 단계에서 첨부 파일의 유효성을 검사할 수 있습니다.| 이름 | 유형 | 설명 |
|---|---|---|
| sysId용 | 문자열 | 검색할 첨부 파일의 Sys_id입니다. |
| 첨부 파일 확인 | 부울 | 첨부 파일을 확인할지 여부를 나타내는 플래그입니다. 유효한 값은 다음과 같습니다.
기본값: true |
| 유형 | 설명 |
|---|---|
| AnyPublisher<NowAttachment, NowDataError> | 성공: NowAttachment - 지정된 첨부 파일을 포함합니다. 실패: NowDataError
|
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let sysId = UUID().uuidString // UUID for the attachment
private func downloadAttachment(sysId: String) {
let publisher = self.attachmentService.attachment(for: sysId, validateAttachment: false)
publisher
.receive(on: DispatchQueue.main)
.sink { [weak self] completion in
if case let .failure(error) = completion {
// Attachment retrieved failed, return NowDataError
}
} receiveValue: { [weak self] (attachment) in
// Attachment retrieved successful, return attachment
}
.store(in: &subscriptions)
}
NowAttachmentService - attachmentMetadata(filter: Filter, limit: Int) async throws
지정된 기준을 충족하는 모든 첨부 파일에 대한 메타데이터를 검색합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 필터 | 필터 | 옵션입니다. 메타데이터가 반환될 첨부 파일을 필터링하는 데 사용할 쿼리 문자열입니다. 기본값: nil - 사용 가능한 모든 첨부 파일에 대한 메타데이터를 반환합니다. 매개 변수를 고려합니다 limit . |
| 제한 | 정수 | 옵션입니다. 반환할 첨부 파일의 메타데이터 최대 수입니다. 기본값: nil - 매개 변수 사양을 충족하는 filter 모든 메타데이터를 반환합니다. |
| 유형 | 설명 |
|---|---|
| [NowAttachmentMetadata] | 메서드가 성공하면 반환됩니다. 일치하는 첨부 파일에 대한 메타데이터를 포함하는 배열입니다. |
| NowDataError | 메서드가 실패할 때 throw됩니다.
|
다음 코드 예제에서는 이 메서드를 호출하는 방법을 보여 줍니다.
let filter = Filter(criteria: [], sortBy: [.desc("created")],
queryCategory: nil)
do {
let metadata = try await attachmentService.attachmentMetadata(filter: filter, limit: 10)
// Metadata retrieval successful
} catch {
// Metadata retrieval failed, NowDataError thrown
}
NowAttachmentService - attachmentMetadata(filter: Filter, limit: Int, completion: @escaping (Result<[NowAttachmentMetadata], NowDataError>))
지정된 기준을 충족하는 모든 첨부 파일에 대한 메타데이터를 검색합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 필터 | 필터 | 옵션입니다. 메타데이터가 반환될 첨부 파일을 필터링하는 데 사용할 쿼리 문자열입니다. 기본값: nil - 사용 가능한 모든 첨부 파일에 대한 메타데이터를 반환합니다. 매개 변수를 고려합니다 limit . |
| 제한 | 정수 | 옵션입니다. 반환할 첨부 파일의 메타데이터 최대 수입니다. 기본값: nil - 매개 변수 사양을 충족하는 filter 모든 메타데이터를 반환합니다. |
| 완료 | @escaping(결과<[NowAttachmentMetadata], NowDataError>) | 메타데이터를 검색한 후 실행할 완성 핸들러입니다. 완료 처리기에 대한 값 반환:
|
| 유형 | 설명 |
|---|---|
| 안 함 |
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let query = "active=true^short_descriptionLIKEbroken"
let filter = Filter(query: query)
attachmentService.attachmentMetadata(filter: filter, limit: limit) { (result) in
DispatchQueue.main.async { [weak self] in
switch result {
case .success(let response):
do {
let data = try JSONEncoder().encode(response)
// Retrieve metadata successfully, return data
} catch {
// Retrieve metadata failed, return error
}
case .failure(let error):
// Retrieve metadata failed, return NowDataError
}
}
}
NowAttachmentService - attachmentMetadata(필터: 필터, 제한: Int)
지정된 기준을 충족하는 모든 첨부 파일에 대한 메타데이터를 검색합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 필터 | 필터 | 옵션입니다. 메타데이터가 반환될 첨부 파일을 필터링하는 데 사용할 쿼리 문자열입니다. 기본값: nil - 사용 가능한 모든 첨부 파일에 대한 메타데이터를 반환합니다. 매개 변수를 고려합니다 limit . |
| 제한 | 정수 | 옵션입니다. 반환할 첨부 파일의 메타데이터 최대 수입니다. 기본값: nil - 매개 변수 사양을 충족하는 filter 모든 메타데이터를 반환합니다. |
| 유형 | 설명 |
|---|---|
| AnyPublisher<[NowAttachmentMetadata], NowDataError> | 성공: NowAttachmentMetadata - 일치하는 첨부 파일에 대한 메타데이터가 포함된 객체입니다. 실패: NowDataError
|
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let query = "active=true^short_descriptionLIKEbroken"
let filter = Filter(query: query)
let publisher = self.attachmentService.attachmentMetadata(filter: filter)
publisher
.receive(on: DispatchQueue.main)
.encode(encoder: JSONEncoder())
.sink { [weak self] completion in
if case let .failure(error) = completion {
// Retrieve metadata failed, return NowDataError
} receiveValue: { [weak self] (data) in
// Retrieve metadata successfully, return data
}
.store(in: &subscriptions
NowAttachmentService - attachmentMetadata(sysId: 문자열의 경우) 비동기 throws
지정된 sys_id와 연결된 첨부 파일에 대한 메타데이터를 검색합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| sysId용 | 문자열 | 메타데이터를 검색할 첨부 파일의 Sys_id입니다. |
| 유형 | 설명 |
|---|---|
| NowAttachmentMetadata | 메서드가 성공하면 반환됩니다. 요청된 첨부 파일에 대한 메타데이터입니다. |
| NowDataError | 메서드가 실패할 때 throw됩니다.
|
다음 코드 예제에서는 이 메서드를 호출하는 방법을 보여 줍니다.
do {
let metadata = try await attachmentService.attachmentMetadata(for: sysId)
// Metadata retrieval successful
} catch {
// Metadata retrieval failed, NowDataError thrown
}
NowAttachmentService - attachmentMetadata(for sysId: String, completion: @escaping (Result<NowAttachmentMetadata, NowDataError>))
지정된 sys_id와 연결된 첨부 파일에 대한 메타데이터를 검색한 다음, 메타데이터가 검색된 후 완료 핸들러를 실행합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| sysId용 | 문자열 | 메타데이터를 검색할 첨부 파일의 Sys_id입니다. |
| 완료 | @escaping(결과<NowAttachmentMetadata, NowDataError>) | 메타데이터를 검색한 후 실행할 완성 핸들러입니다. 완료 처리기에 대한 값 반환:
|
| 유형 | 설명 |
|---|---|
| 안 함 |
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let sysId = UUID().uuidString // UUID for the attachment
attachmentService.attachmentMetadata(for: sysId) { (result) in
DispatchQueue.main.async { [weak self] in
switch result {
case .success(let response):
do {
let data = try JSONEncoder().encode(response)
// Retrieve metadata successfully, return data
} catch {
// Retrieve metadata failed, return error
}
case .failure(let error):
// Retrieve metadata failed, return NowDataError
}
}
}
NowAttachmentService - attachmentMetadata(sysId: 문자열의 경우)
지정된 sys_id와 연결된 첨부 파일에 대한 메타데이터를 검색합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| sysId용 | 문자열 | 메타데이터를 검색할 첨부 파일의 Sys_id입니다. |
| 유형 | 설명 |
|---|---|
| AnyPublisher<[NowAttachmentMetadata], NowDataError> | 성공: NowAttachmentMetadata - 요청된 첨부 파일에 대한 메타데이터가 포함된 객체입니다. 실패: NowDataError
|
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let sysId = UUID().uuidString // UUID for the attachment
let publisher = self.attachmentService.attachmentMetadata(for: sysId)
publisher
.receive(on: DispatchQueue.main)
.encode(encoder: JSONEncoder())
.sink { [weak self] completion in
if case let .failure(error) = completion {
// Retrieve metadata failed, return NowDataError
}
} receiveValue: { [weak self] (data) in
// Retrieve metadata successfully, return data
}
.store(in: &subscriptions)
NowAttachmentService - attachmentMetadataPaginator(filter: Filter, limit: Int)
지정된 기준을 충족하는 모든 첨부 파일에 대한 메타데이터를 검색하고 반환된 메타데이터의 페이지를 반복하기 위한 Paginator 객체를 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 필터 | 필터 | 옵션입니다. 메타데이터가 반환될 첨부 파일을 필터링하는 데 사용할 쿼리 문자열입니다. 기본값: nil - 사용 가능한 모든 첨부 파일에 대한 메타데이터를 반환합니다. 매개 변수를 고려합니다 limit . |
| 제한 | 정수 | 옵션입니다. 반환할 첨부 파일의 메타데이터 최대 수입니다. 기본값: nil - 매개 변수 사양을 충족하는 filter 모든 메타데이터를 반환합니다. |
| 유형 | 설명 |
|---|---|
| Paginator<[NowAttachmentMetadata]> | 성공: NowAttachmentMetadata 객체의 배열입니다. 실패: NowDataError 객체.
|
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let paginator: Paginator<T> = makePaginator(query: query, fetchLimit: 1)
func makePaginator(query: String, fetchLimit: Int?) -> Paginator<[NowAttachmentMetadata]> {
attachmentsService.attachmentMetadataPaginator(filter: Filter(query: query), limit: fetchLimit)
}
NowAttachmentService - 삭제(sysId: 문자열) 비동기 throws
지정된 sys_id 있는 첨부 파일을 삭제합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| sysID | 문자열 | 삭제할 첨부 파일의 Sys_id입니다. |
| 유형 | 설명 |
|---|---|
| 안 함 | 메서드가 성공한 경우 아무 것도 반환되지 않습니다. |
| NowDataError | 메서드가 실패할 때 throw됩니다.
|
다음 코드 예제에서는 이 메서드를 호출하는 방법을 보여 줍니다.
do {
try await attachmentService.delete(sysId: sysId)
// Deletion successful
} catch {
// Deletion failed, NowDataError thrown
}
NowAttachmentService - delete(sysId: String, completion: @escaping (Result<Void, NowDataError>))
지정된 sys_id 있는 첨부 파일을 삭제한 다음, 첨부 파일이 삭제된 후 전달된 완성 핸들러를 실행합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| sysID | 문자열 | 삭제할 첨부 파일의 Sys_id입니다. |
| 완료 | @escaping(결과<무효, NowDataError>) | 첨부 파일이 삭제된 후 실행할 완성 핸들러입니다. 완료 처리기에 대한 값 반환:
|
| 유형 | 설명 |
|---|---|
| 안 함 |
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let sysId = UUID().uuidString // UUID for the attachment
attachmentService.delete(sysId: sysId) { (result) in
DispatchQueue.main.async { [weak self] in
switch result {
case .success:
// Attachment with sysId is deleted
case .failure(let error):
// Failed to delete, with NowDataError
}
}
}
NowAttachmentService - 삭제(sysId: 문자열)
지정된 sys_id 있는 첨부 파일을 삭제합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| sysID | 문자열 | 삭제할 첨부 파일의 Sys_id입니다. |
| 유형 | 설명 |
|---|---|
| AnyPublisher<Void, NowDataError> | 성공: 아무 것도 반환되지 않음 실패: NowDataError
|
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
let publisher = attachmentService.delete(sysId: sysId)
publisher
.receive(on: DispatchQueue.main)
.sink { [weak self] completion in
switch completion {
case .finished:
// Attachment with sysId is deleted
case .failure(let error):
// Failed to delete, with NowDataError
}
} receiveValue: {
}
.store(in: &subscriptions)
NowAttachmentService - init(구성: NowServiceConfiguration, coreServiceProvider: NowCoreServiceProviding)
새 NowAttachmentService 인스턴스를 초기화합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 구성 | NowServiceConfiguration | 서비스를 올바르게 초기화하는 데 필요한 구성 정보입니다. |
| 코어서비스제공자 | NowCoreServiceProviding | 옵션입니다. NowCoreServiceProviding 프로토콜을 구현하는 객체입니다. 기본값: nil |
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
guard let coreService = NowSDK.core() else {
// Error with NowServiceError.sdkNotConfigured
return
}
guard
let instanceUrl = URL(string: "http://sample.service-now.com"),
let serviceConfig = NowSDK.makeServiceConfiguration(for: instanceUrl) else {
// Could not create service –
// NowServiceError.serviceConfigurationInvalid
return
}
let attachmentService = NowAttachmentService(configuration: serviceConfig, coreServiceProvider: coreService)
NowAttachmentService - upload(data: Data, configuration: NowAttachmentUploadConfiguration, progressUpdate: @escaping ProgressUpdate) async throws
첨부 파일 데이터를 업로드하고 업로드 구성에 지정된 대로 테이블의 기록에 첨부합니다.
ProgressUpdate 콜백은 UI 피드백을 제공하는 데 사용할 수 있는 업로드 진행률 정보를 제공합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 데이터 | 데이터 | 업로드할 첨부 파일입니다. |
| 구성 | NowAttachmentUpload 구성 | 다음과 같이 첨부 파일의 업로드 매개변수를 정의하는 구성 정보입니다.
|
| 진행률업데이트 | ProgressUpdate @escaping | 첨부 파일을 검색한 후 실행할 완료 핸들러입니다. 업로드 프로세스가 완료될 때까지 여러 번 호출됩니다. 완료 처리기에 대한 값 반환: ProgressUpdate - 업로드의 현재 진행률을 반환합니다.
|
| 유형 | 설명 |
|---|---|
| NowAttachmentMetadata | 메서드가 성공하면 반환됩니다. 업로드된 메타데이터가 포함된 객체입니다. |
| NowDataError | 메서드가 실패할 때 throw됩니다.
|
다음 코드 예제에서는 이 메서드를 호출하는 방법을 보여 줍니다.
func uploadFile(for tableName: String, sysId: String, mimeType: String, encryptionContext: String?, data: Data, filename: String) async throws -> NowAttachmentMetadata {
let mimeType = MediaUtilities.mimeType(forFileName: filename)
let uploadConfig = NowAttachmentUploadConfiguration(tableName: tableName,
recordSysId: sysId,
fileName: filename,
contentType: mimeType,
encryptionContext: encryptionContext)
do {
let attachmentMetadata = try await attachmentService.upload(data: data, configuration: uploadConfig) { (_, _, _) in }
return attachmentMetadata
} catch {
// Handle NowDataError
throw error
}
}
NowAttachmentService - upload(data: Data, configuration: NowAttachmentUploadConfiguration, progressUpdate: @escaping ProgressUpdate, completion: @escaping (Result<NowAttachmentMetadata, NowDataError>))
첨부 파일 데이터를 업로드하고 업로드 구성에 지정된 대로 테이블의 기록에 첨부합니다.
ProgressUpdate 콜백은 UI 피드백을 제공하는 데 사용할 수 있는 업로드 진행률 정보를 제공합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 데이터 | 데이터 | 업로드할 첨부 파일입니다. |
| 구성 | NowAttachmentUpload 구성 | 다음과 같이 첨부 파일의 업로드 매개변수를 정의하는 구성 정보입니다.
|
| 진행률업데이트 | ProgressUpdate @escaping | 첨부 파일을 검색한 후 실행할 완료 핸들러입니다. 업로드 프로세스가 완료될 때까지 여러 번 호출됩니다. 완료 처리기에 대한 값 반환: ProgressUpdate - 업로드의 현재 진행률을 반환합니다.
|
| 완료 | @escaping(결과<NowAttachmentMetadata, NowDataError>) | 메타데이터가 업로드된 후 실행할 완료 핸들러입니다. 완료 처리기에 대한 값 반환:
|
| 유형 | 설명 |
|---|---|
| 안 함 |
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
typealias ProgressUpdate = (_ bytesWritten: Int64, _ totalBytesWritten: Int64, _ totalBytesExpectedToWrite: Int64) -> Void
let image = UIImage(named: "photo.png")
let data = image.pngData()
let recordSysId = "" // Sys_id of the record on the SN instance
let config = NowAttachmentUploadConfiguration(
tableName: "tableName",
recordSysId: recordSysId,
fileName: "photo.png",
contentType: "image/png",
encryptionContext: nil)
private func uploadFile(
data: Data,
config: NowAttachmentUploadConfiguration,
progress: @escaping ProgressUpdate) {
attachmentService.upload(data: data, configuration: config, progressUpdate: progress) { (result) in
DispatchQueue.main.async { [weak self] in
switch result {
case .success(let response)
do {
let data = try JSONEncoder().encode(response)
// Upload file successfully, return data
} catch
// Upload file decode failed, return error
}
case .failure(let error):
// Upload file failed, return NowDataError
}
}
}
NowAttachmentService - 업로드(데이터: 데이터, 구성: NowAttachmentUploadConfiguration, progressUpdate: @escaping ProgressUpdate)
첨부 파일 데이터를 업로드하고 업로드 구성에 지정된 대로 테이블의 기록에 첨부합니다.
ProgressUpdate 콜백은 UI 피드백을 제공하는 데 사용할 수 있는 업로드 진행률 정보를 제공합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 데이터 | 데이터 | 업로드할 첨부 파일입니다. 업로드할 수 있는 첨부 파일의 데이터 크기와 유형은 인스턴스에서 제어합니다 ServiceNow . |
| 구성 | NowAttachmentUploadConfiguration | 다음과 같이 첨부 파일의 업로드 매개변수를 정의하는 구성 정보입니다.
|
| 진행률업데이트 | ProgressUpdate @escaping | 첨부 파일을 검색한 후 실행할 완료 핸들러입니다. 완료 처리기에 대한 값 반환: ProgressUpdate - 업로드의 현재 진행률을 반환합니다. 업로드 프로세스가 완료될 때까지 여러 번 호출됩니다.
|
| 유형 | 설명 |
|---|---|
| AnyPublisher<NowAttachmentMetadata, NowDataError> | 성공: NowAttachmentMetadata - 요청된 첨부 파일에 대한 메타데이터가 포함된 객체입니다. 실패: NowDataError
|
다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.
typealias ProgressUpdate = (_ bytesWritten: Int64, _ totalBytesWritten: Int64, _ totalBytesExpectedToWrite: Int64) -> Void
let image = UIImage(named: "photo.png")
let data = image.pngData()
let recordSysId = "" // Sys_id of the record on the SN instance
let config = NowAttachmentUploadConfiguration(
tableName: "tableName",
recordSysId: recordSysId,
fileName: "photo.png",
contentType: "image/png",
encryptionContext: nil)
private func uploadFile(data: Data,
config: NowAttachmentUploadConfiguration,
progress: @escaping ProgressUpdate) {
let publisher = attachmentService.upload(data: data, configuration: config, progressUpdate: progress)
publisher
.receive(on: DispatchQueue.main)
.encode(encoder: JSONEncoder())
.sink { [weak self] completion in
if case let .failure(error) = completion {
// Upload file failed, return NowDataError
}
} receiveValue: { [weak self] (data) in
// Upload file successfully, return data
}
.store(in: &subscriptions)
}