2014-09-23 2 views
2

Swift와 함께 iOS 8 앱을 만들려고하는데 JSON에서 데이터를 다운로드하여 저장해야하지만 핵심 데이터 메커니즘을 이해하지 못합니다. (나는 안드로이드에서 ORM Lite와 sqlite-net이있는 Windows Phone을 사용하고있다).코어 데이터를 동 기적으로 사용하는 방법은 무엇입니까?

"GetAllNewsTask"는 데이터베이스의 모든 뉴스를 반환하고 "UpdateAllNewsTask"는 JSON을 다운로드하고 구문 분석하고 데이터베이스에 저장하고 모든 News를 반환하는 두 가지 작업을 수행하려고합니다.

엔티티 객체

class func getEntitiesFromJson(json: JSONValue) -> [NewsEntity]?{ 
    var rList : [NewsEntity] = [] 

    var array = json.array 
    var countItr = array?.count ?? 0 

    if(array == nil){ 
     return nil 
    } 

    if(countItr > 0){ 
     for index in 0...countItr-1{ 
      var news = NewsEntity() 
      var jsonVal = array?[index] 

      news.id = jsonVal?["id"].integer ?? 0 
      ........ 

      rList.append(news) 
     } 
    } 

    return rList 
} 

GetAllNewsTask에 구문 분석 된 JSON 문자열을 변환 getEntitiesFromJson 기능

(현재 harcoded 빈 배열을 반환 newsDao.findAll는(), 내가 모든 NewsEntity 기적을 선택하는 방법을 발견하지 않았다)

class GetAllNewsTask:NSOperation { 

var result : Array<News>? 

override func main() ->(){ 
    result = executeSync() 
} 

func executeSync() -> Array<News>? { 
    let newsDao = NewsDAO() 
    let entities = newsDao.findAll() 

    return NewsModel.getVOsFromEntities(entities) 
} 

UpdateAllNewsTask

class UpdateAllNewsTask:NSOperation { 

var result : Array<News>? 

override func main() ->(){ 
    result = executeSync() 
} 

func executeSync() -> Array<News>? { 

    let response = JsonServices.getAllNews() 
    var managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext! 
    var entityDescription = NSEntityDescription.entityForName("NewsEntity", inManagedObjectContext: managedObjectContext) 
    var entities = NewsModel.getEntitiesFromJson(response) 

    //TODO insert new, update existing and remove old 

    return GetAllNewsTask().executeSync() 
} 

내가하려고 해요 모든 NewsEntity를 추가하거나 업데이트하고 오래된 것을 삭제하려면 Java에서 List.removeAll(Collection<T>)을 사용했지만 Swift에서이 작업을 수행하는 방법을 찾을 수 없습니다. NewsEntity 클래스에서 equals 및 hashcode를 재정의 할 때 예외가 발생했습니다.

계속하기 전에 올바른 방법입니까? 그렇다면 유용한 방법을 시연하는 훌륭한 자습서가 있습니까? 올바른 방법이 없다면?

+0

내 대답은 도움이되지 않았다 제공 찾을 수 있는가? –

답변

5

일반적으로 코어 데이터 트랜잭션은 객체의 관리 객체 컨텍스트 스레드에서 수행되어야합니다. 이러한 이유로 NSManagedObjectContextperformBlockperformBlockAndWait 통화가 표시됩니다.

메인 스레드를 사용하고 있기 때문에 기술적으로 동기 적이므로 메인 스레드에서 업데이트 호출을한다고 가정합니다. 그렇지 않다면 나는 당신의 동기화 전화를 performBlockAndWait 전화로 포장 할 것을 제안 할 것입니다.

즉,을 활용하면 멀티 스레드 코어 데이터를 구현하는 방법을 설명 할 수 있습니다. 백그라운드 스레드에서 항상 서버 관련 업데이트를 수행해야합니다.

removeAll 기능을 구현하려면 제거하려는 모든 개체를 수동으로 가져와 context.deleteObject(managedObject)을 호출해야합니다. 또는 계단식 삭제를 강화해야하는 강력한 기능이 필요한 경우 관계를 선택할 때 모델 편집기에서이를 설정할 수 있습니다. 다음 삭제 규칙을 사용할 수 있습니다

  • 무효화
  • 캐스케이드
  • 조치가 마지막으로

거부하지, 당신은 일반적으로 사용되는 코어 데이터 스택의 일부를 설명하는데 유용 this post을 찾을 수 있습니다 셋업과 각각의 다양한 성능.iOS 및 행운을 빕니다 :) AS를

편집

에 오신 것을 환영 제외하고는 레이 Wenderlich은 어떤 사람이 Core Data Tutorials

+1

Apple의 핵심 데이터 프로그래밍 안내서는 대기열 제한 (performBlock 등) 또는 중첩 된 컨텍스트를 다루지 않습니다. performBlockAndWait를 사용하는 경우 : performBlockAndWait : performBlockAndWait를 사용하는 경우 그 차이점을 알고 있어야합니다. http://quellish.tumblr.com/post/93355099502/performblock-vs-performblockandwait – quellish

관련 문제