2015-01-19 4 views
1

Swift에서 Bridging Header를 사용하여 RestKit을 사용하려고합니다. 나는 URL과 JSON 파일 "http://local:8888/api/0.1/jobs"Swift에서 RestKit 및 CoreData 사용

{"data":[{"id": "1", "name": "job1",..},{"id": "2", "name": "job2",...},...]} 

JSON 파일 6 개 요소 작업이 있습니다. CoreData 용 Job 엔티티를 작성하고 Job 클래스를 생성했습니다.

func setupRestKit() { 
    var manager = RKObjectManager(baseURL: NSURL(string: "http://local:8888/api/0.1/")) 

    RKObjectManager.setSharedManager(manager) 

    var managedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil) 
    var managedObjectStore = RKManagedObjectStore(managedObjectModel: managedObjectModel) 
    manager.managedObjectStore = managedObjectStore 

    RKManagedObjectStore.setDefaultStore(manager.managedObjectStore) 

    var jobMapping = RKEntityMapping(forEntityForName: "Job", inManagedObjectStore: manager.managedObjectStore) 

    jobMapping.identificationAttributes = ["id"] 
    jobMapping.addAttributeMappingsFromDictionary([ 
     "id"  : "id", 
     "name"  : "name" 
    ]) 

    let responseDescriptor = RKResponseDescriptor(
     mapping: jobMapping, 
     method: RKRequestMethod.GET, 
     pathPattern: "/jobs", 
     keyPath: "data", 
     statusCodes: NSIndexSet(index: 200) 
    ) 

    manager.addResponseDescriptor(responseDescriptor) 

    managedObjectStore.createPersistentStoreCoordinator() 

    let storePath = RKApplicationDataDirectory().stringByAppendingPathComponent("MyApp.sql") 

    var persistentStore = managedObjectStore.addSQLitePersistentStoreAtPath(
     storePath, 
     fromSeedDatabaseAtPath: nil, 
     withConfiguration: nil, 
     options: optionsForSqliteStore(), 
     error: nil 
    ) 

    managedObjectStore.createManagedObjectContexts() 

    managedObjectStore.managedObjectCache = RKInMemoryManagedObjectCache(
     managedObjectContext: managedObjectStore.persistentStoreManagedObjectContext 
    ) 
} 

func optionsForSqliteStore() -> NSDictionary { 
    return [ 
     NSInferMappingModelAutomaticallyOption: true, 
     NSMigratePersistentStoresAutomaticallyOption: true 
    ]; 
} 

그리고의 ViewController에서 :

이런 식으로 RestKit을 설정

override func viewDidLoad() { 
    super.viewDidLoad() 

    var fetchRequest = NSFetchRequest(entityName: "Job") 

    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)] 

    self.fetchedResultsController = NSFetchedResultsController(
     fetchRequest: fetchRequest, 
     managedObjectContext: RKManagedObjectStore.defaultStore().mainQueueManagedObjectContext, 
     sectionNameKeyPath: nil, 
     cacheName: nil 
    ) 

    self.fetchedResultsController?.delegate = self 

    self.fetchedResultsController?.performFetch(nil) 

    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell") 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    if let sections = fetchedResultsController?.sections { 
     return sections.count 
    } else { 
     return 0 
    } 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if let sections = fetchedResultsController?.sections { 
     var sectionInfo: AnyObject = sections[section] 
     return sectionInfo.numberOfObjects 
    } else { 
     return 0 
    } 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell 

    if let fetchedResults = fetchedResultsController { 
     cell.textLabel?.text = fetchedResults.objectAtIndexPath(indexPath).name 
    } 

    return cell 
} 

가 numberOfSectionsInTableView 방법은 반환 값을 값 0하고있는 tableView numberOfRowsInSection을 반환을 0 너무.

Restikit을 사용하는 Swift의 예제가 실제로 없기 때문에 Objective-C에서 코드를 변환하여 많은 솔루션을 시도합니다.

SwiftyJson 프레임 워크를 사용하여 JSON의 데이터에 액세스 할 수 있으며 나 또한 CoreData 데이터베이스에서 저장 요소별로 구성을 확인합니다.

이 간단한 RestApi로 작성한 6 가지 작업을 가져와 tableview에 인쇄하고 싶습니다.

구성 중에 뭔가 잘못했다고 생각하지만 그게 무엇인지 모르겠습니다.

+0

CoreData에서 RestKit을 사용하지 않았으므로 뭔가 놓친 것이 가능합니다. 그러나 NSFetchedResultsController를 사용하여 CoreData에서 데이터를 가져 오는 위치를 볼 수는 있지만 실제로는 보이지 않습니다. 서버에서 데이터를 가져옵니다. –

+0

데이비드 고맙다. 나는 농담이다, 나는 단지'manager.getObjectsAtPath (...) '를 사용해야 만한다. – MeaK

+0

NP 미크, 우리 모두는 우리의 두뇌 방귀를 가지고있다. 이 문제를 오타로 끝내는 것이 좋습니다. –

답변

1

데이빗은 서버에서 가져 오는 것을 잊었습니다 (감사).

// I just need to map correctly the path 
var manager = RKObjectManager(baseURL: NSURL(string: "http://local:8888/api/0.1/jobs")) 

[...] 
var persistentStore = managedObjectStore.addSQLitePersistentStoreAtPath(
    storePath, 
    fromSeedDatabaseAtPath: nil, // Set-up this 
    withConfiguration: nil, 
    options: optionsForSqliteStore(), 
    error: nil 
) 

managedObjectStore.createManagedObjectContexts() 

managedObjectStore.managedObjectCache = RKInMemoryManagedObjectCache(
    managedObjectContext: managedObjectStore.persistentStoreManagedObjectContext 
) 
manager.getObjectsAtPath(
    "", // Add path 
    parameters: nil, 
    success: nil, 
    failure: nil 
) 

그리고 내보기에는 항목이 있습니다.