2016-06-28 6 views
2

Мне нужны некоторые предложения по созданию магазина iOS: Мне нужно импортировать данные из Rest Api в CoreData моего приложения самым быстрым способом.Swift: сохранение объектов в CoreData прямо из JSON api rest

Я хотел бы использовать Alamofire + ObjectMapper или непосредственно AlamofireObjectMapper для отображения результатов JSON в мою модель пользовательских объектов, а затем сохранить их в CoreData.

Я пытался использовать AlamofireObjectMapper, но мне не удается установить назначаемый обычай NSManagedObject я использую, чтобы сохранить запись в CoreData БД, а не объяснено здесь

https://github.com/tristanhimmelman/AlamofireObjectMapper

До сих пор я использовал это руководство http://code.tutsplus.com/tutorials/core-data-and-swift-subclassing-nsmanagedobject--cms-25116

создать два класса

MyCustomObjectClass.swift

MyCustomObjectClass + CoreDataProperties.swift

но есть способ настроить отображение MyCustomObjectClass таким образом, что с помощью простого запроса api AlamofireObjectMapper я получаю JSON, создаю объекты и сохраняю их напрямую?

Другие возможные решения?

Спасибо за помощь

ответ

3

Чтобы проанализировать json на NSManagedObject подклассы, рекомендую Groot. Для этого требуется небольшая конфигурация, но она отлично работает.

Я также создал cocoapod под названием AlamofireCoreData, который оборачивает Гроота в Alamofire сериализатора, я думаю, что вы можете использовать, чтобы делать то, что вы просите:

// User is a `NSManagedObject` subclass 
Alamofire.request(url) 
    .responseInsert(context: context, type: User.self) { response in 
     switch response.result { 
     case let .success(user): 
      // The user object is already inserted in your context! 
     case .failure: 
      // handle error 
     } 
} 

Надеется, что это может помочь вы.

3

Вы пробовали с помощью Alamofire & SwiftyJSON tutorial? Учебное пособие охватывает:

  • Получение данных с удаленного сервера при запуске приложения.
  • Хранение данных внутри приложения, позволяющее пользовательскому интерфейсу отображать данные только из внутренней базы данных.
  • Fetching и хранение данных в фоновом режиме, и уведомляя поток пользовательского интерфейса, когда он закончил свою работу
  • разборе JSON, проверку на дублирование до сохранения во внутренней базе данных

Учебника немного длиннее для повторной публикации здесь, но он должен удовлетворять ваши потребности красиво.

0

Api вызова с основными данными в Swift 4

импорт UIKit импорт CoreData класса ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { вар displayDatasssss = displyDataClass контекста вара = (! UIApplication.shared.delegate в AppDelegate) .persistentContainer.viewContext

@IBOutlet weak var tableView: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    print("hai") 

    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return displayDatasssss.count 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1 





    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "User") 
    cell.label.text = displayDatasssss[indexPath.row].email 


    let _:AppDelegate = (UIApplication.shared.delegate as! AppDelegate) 
    let context:NSManagedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    let newUser = NSEntityDescription.insertNewObject(forEntityName: "User", into: context) as NSManagedObject 
    newUser.setValue(cell.label.text, forKey: "name") 

    do { 
     try context.save() 
    } catch {} 
    print(newUser) 
    print("Object Saved.") 


    let myStringValue = cell.label.text 
    request.predicate = NSPredicate (format: "name == %@", myStringValue!) 
    do 
    { 
     let result = try context.fetch(request) 
     if result.count > 0 
     { 
      let nameData = (result[0] as AnyObject).value(forKey: "name") as! String 
      print(nameData) 

     } 
    } 
    catch { 
     //handle error 
     print(error) 
    } 

    return cell 
} 

@IBAction func tap(_ sender: Any) { 
    let url = "http://jsonplaceholder.typicode.com/users" 
    var request = URLRequest(url: URL(string: url)!) 
    request.httpMethod = "GET" 
    let configuration = URLSessionConfiguration.default 
    let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) 
    let task = session.dataTask(with: request){(data, response,error)in 
     if (error != nil){ 
      print("Error") 
     } 
     else{ 
      do{ 
       // Array of Data 
       let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray 

       for eachData in fetchData { 

        let eachdataitem = eachData as! [String : Any] 
        let name = eachdataitem["name"]as! String 
        let username = eachdataitem["username"]as! String 

        let email = eachdataitem["email"]as! String 
        self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email)) 
       } 
       self.tableView.reloadData() 
      } 
      catch{ 
       print("Error 2") 
      } 

     } 
    } 
    task.resume() 

} 
} 

класс displyDataClass { имя вар: String вар имя пользователя: Стри нг вар электронная почта: String

init(name : String,username : String,email :String) { 
    self.name = name 
    self.username = username 
    self.email = email 
} 

}

 Смежные вопросы

  • Нет связанных вопросов^_^