본문 바로가기

Swift

오류 처리 함수 구현

https://explorer89.tistory.com/214

 

Swift의 에러 처리 방법에 대해 설명해주세요.

Swift에서 **에러 처리(Error Handling)**는 프로그램 실행 중 발생할 수 있는 예외 상황에 대비하여 오류를 처리하고 안정적으로 코드가 실행될 수 있도록 도와줍니다. Swift는 명확하고 안전한 에러 처

explorer89.tistory.com

 

 

do-catch 구문은 Swift에서 오류가 발생할 수 있는 코드의 실행을 감싸는 구문으로, 오류 발생 시 처리 방법을 지정할 수 있습니다. 이 구문은 특히 파일 입출력이나 데이터베이스와 같은 작업에서 유용하며, Swift는 이러한 오류 발생 가능성이 있는 함수에서 throws 키워드를 사용하여 호출자가 오류를 처리할 수 있도록 합니다.

 

do-catch 구문의 구성

do {
    // try 키워드로 오류가 발생할 수 있는 함수를 호출합니다.
    // 오류가 발생하지 않으면 아래 코드들이 순차적으로 실행됩니다.
} catch {
    // catch 블록에서는 오류가 발생했을 때의 대체 처리를 수행합니다.
    // 오류 내용을 출력하거나, 대체 작업을 수행할 수 있습니다.
}

 

 

 

이 함수는 feedID에 해당하는 Core Data 엔티티와 관련 이미지 파일을 삭제하는 역할을 합니다.

    func deleteFeedItem(feedID: String) {
        let request: NSFetchRequest<FeedEntity> = FeedEntity.fetchRequest()
        request.predicate = NSPredicate(format: "feedID == %@", feedID)

        do {
            let results = try context.fetch(request)
            if let feedEntity = results.first {
                // 이미지 경로 삭제
                if let imagePathsString = feedEntity.imagePaths {
                    let imagePathsArray = imagePathsString.components(separatedBy: ",")
                    storageManager.deleteImages(from: imagePathsArray)
                }
                // Core Data에서 엔티티 삭제
                context.delete(feedEntity)
                try context.save()
                print("FeedItem이 성공적으로 삭제되었습니다.")
            
            }
        } catch {
            print("FeedItem 삭제 실패: \(error)")
        }
    }

 

요청 준비 (NSFetchRequest):

let request: NSFetchRequest<FeedEntity> = FeedEntity.fetchRequest()
request.predicate = NSPredicate(format: "feedID == %@", feedID)

 

여기서는 Core Data에서 feedID에 해당하는 엔티티를 찾기 위해 요청을 준비합니다. NSPredicate를 사용해 특정 feedID 조건에 맞는 엔티티만 가져오도록 설정합니다.

 

do 블록:

do {
    let results = try context.fetch(request)
    ...
} catch {
    print("FeedItem 삭제 실패: \(error)")
}

 

  • try 키워드는 context.fetch(request)가 오류를 발생시킬 가능성이 있으므로 사용됩니다.
  • 오류가 발생하지 않으면, Core Data에서 요청된 엔티티를 results에 가져오고, 이후 삭제 작업을 진행합니다.

 

엔티티 및 이미지 삭제:

if let feedEntity = results.first {
    // 이미지 경로 삭제
    if let imagePathsString = feedEntity.imagePaths {
        let imagePathsArray = imagePathsString.components(separatedBy: ",")
        storageManager.deleteImages(from: imagePathsArray)
    }
    // Core Data에서 엔티티 삭제
    context.delete(feedEntity)
    try context.save()
    print("FeedItem이 성공적으로 삭제되었습니다.")
}

 

 

  • results.first를 사용해 조건에 맞는 첫 번째 엔티티를 가져옵니다.
  • 이미지 경로가 있으면 storageManager.deleteImages(from:)를 통해 이미지 파일을 삭제하고, Core Data 엔티티도 context.delete(feedEntity)로 삭제합니다.
  • context.save()로 변경 사항을 저장하고 성공 메시지를 출력합니다.

 

catch 블록:

  • catch 블록은 do 블록 내에서 오류가 발생했을 경우 실행됩니다. 이 예제에서는 오류 내용을 출력해 어떤 오류가 발생했는지 알 수 있도록 처리합니다.

 

함수 설계 흐름

  1. 목적 정의: 함수의 주요 목적을 정의합니다. 예: deleteFeedItem은 특정 feedID에 대한 데이터를 삭제하는 것.
  2. 요청 설정: 어떤 데이터를 가져올지 또는 삭제할지를 결정합니다. Core Data에서 데이터 요청 시 fetchRequest와 predicate를 설정하여 원하는 엔티티만 가져오도록 설정합니다.
  3. 예외 처리 (오류 발생 가능성): Core Data 요청이 실패할 수 있으므로 do-catch 구문으로 오류를 처리합니다.
  4. 실행 및 후처리: 요청된 엔티티가 존재하면 필요한 작업(삭제 및 저장)을 수행하고, 작업이 완료된 후 오류가 발생할 수 있는 구문에 대해 try를 사용해 오류를 체크합니다.
  5. 결과 반환 또는 상태 표시: 삭제 성공 여부를 사용자에게 알리기 위해 성공 및 오류 메시지를 표시합니다.

이렇게 설계하면, 함수 내에서 오류가 발생할 가능성을 고려하여 안전하게 데이터를 처리할 수 있습니다. deleteFeedItem 함수는 이러한 흐름을 따르고 있습니다.