2015-01-19 3 views
1

Я пытаюсь использовать RestKit в Swift с заголовком моста. У меня есть JSON-файл с URL "http://local:8888/api/0.1/jobs"Использование RestKit и CoreData с Swift

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

JSON файл имеет 6 элементов задания. Я создал объект Job для CoreData и сгенерировал класс Job.

я создал RestKit таким образом:

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:

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 вернуть значение и Tableview numberOfRowsInSection возвращает значение слишком.

Я пытаюсь найти множество решений, переведя код из Objective-C, потому что на Swit очень мало примеров использования RestKit.

Я могу получить доступ к данным из JSON с помощью среды SwiftyJson, а также самостоятельно проверить конфигурацию элемента хранилища в базе данных CoreData.

Я хочу получить 6 рабочих заданий, которые я создал с помощью этого простого RestApi, и распечатать его в таблице tableView.

Я думаю, что у меня что-то не так во время настройки, но я не знаю, что это такое.

+0

Возможно, что у меня что-то не хватает, поскольку я не использовал RestKit с CoreData, но я вижу, откуда вы извлекаете данные из CoreData с помощью 'NSFetchedResultsController', но я не вижу ничего, что на самом деле заставляют данные извлекаться с сервера. –

+0

Спасибо, Дэвид, я шутка, мне просто нужно использовать 'manager.getObjectsAtPath (...)' – MeaK

+0

NP Meak, у всех нас есть наши мозговые пукалы. Я предлагаю закрыть это как опечатку. –

ответ

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 
) 

И я получаю предметы на мой взгляд.

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