1
resposta

fetchedObjects retornando nill

Boa noite! Estou com um pequeno problema, ao fazer o fetchedObjects ele retorna nill, já analisei todo o código e não consigo encontrar o erro.

Obs - 1: Meus objeto Product é um pouco complexo eu estou usando só dois parâmetros para testar, mas deixei todos como opcionais

Obs - 2: O app não encerra e nem lança erro, apenas retorna nill

//
//  ProductService.swift
//  Tarv
//
//  Created by Ramires Moreira on 6/15/18.
//  Copyright © 2018 Adacemy. All rights reserved.
//

import UIKit
import CoreData

class ProductService {

     var context : NSManagedObjectContext {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        return appDelegate.persistentContainer.viewContext
    }

    var fetchResult : NSFetchedResultsController<Product> {
        let fetchRequest:NSFetchRequest<Product> = Product.fetchRequest()
        let sort = NSSortDescriptor(key: "name", ascending: true)
        fetchRequest.sortDescriptors = [sort]
        let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        return controller
    }

     func getProducts( completion : @escaping ( [Product]? )->Void ){
        for _ in 0...5 {
            save()
        }
        do {
            try fetchResult.performFetch()
            if let list = fetchResult.fetchedObjects { // retorna nill
                completion(list)
            }else{
                completion(nil)
            }
        } catch {
            print(error.localizedDescription)
            completion(nil)
        }
    }


    @discardableResult
    func save() -> Bool {
        let p = Product(context: context)
        p.id = 1
        p.name = "Blusa"
        p.price = 24.89
        do {
            context.insert(p)
           try context.save()
            return true
        }catch{
            print(error)
            return false
        }
    }

}
1 resposta

Oi Ramires, tudo bem?

Pelo que eu vi, o problema está nessa variável computada fetchResult.

Como você só precisa utilizá-la quando for de fato chamar o método getProducts(), é uma boa prática utilizar a keyword lazy, assim só instanciamos se realmente for necessário.

Resumindo, você pode fazer essa alteração:

lazy var fetchResult : NSFetchedResultsController<Product> = {
        let fetchRequest:NSFetchRequest<Product> = Product.fetchRequest()
        let sort = NSSortDescriptor(key: "name", ascending: true)
        fetchRequest.sortDescriptors = [sort]
        let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

        return controller
    }()

Espero ter ajudado.

Abs.