在后台下载JSON并将数据放入Swift

时间:2016-04-25 15:15:24

标签: json core-data swift2

这是问题所在,我正在通过SwiftyJson从(JSON)下载数据,我在应用程序启动时这样做意味着每次启动我都要向服务器发送请求,然后我将其保存到coreData中并想要将其提取到struct的数组并将其填充到tableView中,这是我一般要做的事情,并且当我因为连接或其他任何原因无法连接到服务器时我想从CoreData加载数据,

这是我到目前为止所做的事情

class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

json()

}

func json {
deleteData()

// doing the parse and serialization
saveJson()

}

savejson{

// save into coredata ... manageContext and ....
}
// and rest of appdelegate


}
deleteData{

    let fetchRequest = NSFetchRequest(entityName: ",myentityName")
            fetchRequest.returnsObjectsAsFaults = false

        do {

            let results = try manageContext.executeFetchRequest(fetchRequest)
            for manageObject in results{

                let managedObjectData : NSManagedObject = manageObject as! NSManagedObject

                manageContext.deleteObject(managedObjectData)
            }
        }catch let error as NSError {

            print(" error : \(error) \(error.userInfo) ")
        }

    }


}

然后我在另一个viewController(tableViewController)中使用数据

Class table: UITableViewController{

    override func viewWillAppear(animated: Bool) {

fetchCoreDate()  //and put it into struct

}

//rest of the class table for table populate

}

这是我用来在viewController

之间传递数据的结构
  struct logs{

var logId: String
var logName: String
}

问题是我下载所有数据,因为我在控制台中打印它们,我看到表中的数据但是当我把删除功能放在那里时,它会删除eveything,我试图删除过去的数据并替换他们有新的,但Json下载比应用程序启动时间更长,所以它在加载表后完成下载,然后表没有加载新数据,我应该省略删除函数来查看数据,但它总是添加到过去的数据,我看到记录的重复(如果省略删除)

使用删除功能我没有在表格中看到任何内容我会看到重复的内容(请记住,我想下载数据并将其替换为新数据,因为它有时会添加不)

抱歉,它有点长,但场景是以某种方式在不同的viewController之间工作,所以我应该把它们全部发布

1 个答案:

答案 0 :(得分:0)

我找到了自己的答案,有些日子在努力解决这个问题,答案就在于你为删除方法提出的问题,它应该在task.resue()之前或异步任务之前进行调整

func json {

....
....
deletedata
asynctask(...)

// doing the parse and serialization
saveJson()

}

OR

func json {

{
// doing the parse and serialization
saveJson()
deleteData()}
task.resume()


}