大尺寸领域数据插入耗时超过 7 分钟 json
Realm data Insertion took over 7mins for big size json
我使用 Alamofire 下载大约 7MB 左右的大 json 数据,并使用 RealmSwift 将数据存储在 realmobject 和 SwiftyJSON 以 parse.My 在完成下载后插入领域对象 json 似乎真的很慢 insertion.Was 我的错误代码有问题吗?请指导我。
首先我会展示最简单的 Json :
{
{
"Start" : "40000",
"End" : "1000000",
"Name" : "Smith",
"Address" : "New York"
},{...},more than 7000 records...
}
这是我的 AlamofireAPI 协议
import Foundation
import Alamofire
import SwiftyJSON
protocol RequestDataAPIProtocol{
func didSuccessDownloadingData(results:JSON,statusCode : Int)
func didFailDownloadingData(err : NSError)
}
class RequestDataAPI{
var delegate : RequestDataAPIProtocol
init(delegate: RequestDataAPIProtocol){
self.delegate=delegate
}
func post(requestURL:String,param:[String:String]){
Alamofire.request(.GET, requestURL, parameters: param)
.validate(statusCode: [200,500])
.responseJSON(completionHandler: { (response: Response<AnyObject, NSError>) -> Void in
if let error = response.result.error {
self.delegate.didFailDownloadingData(error)
} else if let jsonObject: AnyObject = response.result.value {
let json = JSON(jsonObject)
self.delegate.didSuccessDownloadingData(json,statusCode: (response.response?.statusCode)!)
}
})
}
func doRequestSiteData(token : String){
post(REQUEST_DATA,param:["data":"All","token":token])
}
}
这是我的领域数据库助手
import Foundation
import RealmSwift
class DBHelper{
func insertUserData(list: UserList){
do {
let realm = try! Realm()
try realm.write({ () -> Void in
realm.add(list,update: true)
})
} catch let error as NSError {
print("Insert Error : \(error)")
}
}
}
这是我的领域模型对象
import Foundation
import RealmSwift
class UserList: Object {
dynamic var start : String = ""
dynamic var end : String = ""
dynamic var name : String = ""
dynamic var address : String = ""
}
和最终代码,视图控制器,
class ViewController : UIViewController , RequestDataAPIProtocol{
var dbHelper = DBHelper()
var requestDataAPI : RequestDataAPI!
override func viewDidLoad() {
super.viewDidLoad()
requestDataAPI = RequestDataAPI(delegate : self)
}
override func viewDidAppear(animated : Bool){
//assume there is one token to request data
requestDataAPI.doRequestSiteData(token)
}
func didSuccessDownloadingData(results: JSON, statusCode: Int){
dispatch_async(dispatch_get_main_queue(), {
print("Downloaded JSON")
switch statusCode{
case 200 :
if results.count > 0{
if let users = results.array {
for user in users{
let userList=UserList()
userList.start=user["Start”].stringValue
userList.end=user[“End”].stringValue
userList.name=user[“Name”].stringValue
userList.address =user[“Address”].stringValue
self.dbHelper.insertUserData(userList)
}
}
}
// took about more than 7 mins
print(“Insertion Done”)
break
case 500,401,400 :
//TODO:
default : break
}
})
}
}
我知道描述所有代码步骤真的很愚蠢,我尽可能简单地编写将 json 数据插入领域 swift 的工作流程。
我只想让所有人都知道我的工作流程在处理这么多 json 数据和插入时是好是坏。
我问这个问题的原因是数据插入需要大约 7 分钟以上才能完成。
所以,我真的需要帮助来优化我的代码。
有指导吗?
更新:我使用 RequestDataAPI 中的委托和协议,我从 JamesQueue 教程中学习了这种风格,因为我完全是初学者,仍在学习 Swift.ViewController 是 updated.That 是我的整个过程细节,没有更多的代码 left.Editing 我的问题或答案感谢代码优化。
insertUserData
方法方法在循环中打开交易这么多次。提交交易是一个有点昂贵的操作。
您可以尝试在循环外向 open/commit 发送交易吗?
也就是说,在进入循环前打开事务,在循环结束后提交一次事务。像下面这样:
if results.count > 0 {
if let users = results.array {
let realm = try! Realm()
try realm.write {
for user in users{
let userList=UserList()
userList.start=user["Start”].stringValue
userList.end=user[“End”].stringValue
userList.name=user[“Name”].stringValue
userList.address =user[“Address”].stringValue
realm.add(userList,update: true)
}
}
}
}
我已使用此代码解决了插入缓慢的问题。
func addAsBatch<T: Object>(_ data: [T]) {
if !isRealmAccessible() { return }
let realm = try! Realm()
realm.refresh()
realm.beginWrite()
for object in data {
realm.add(object)
}
try? realm.commitWrite()
}
显示函数在您的示例中的使用 -
let userList = UserList()
userList.start = user["Start”].stringValue
userList.end = user[“End”].stringValue
userList.name = user[“Name”].stringValue
userList.address = user[“Address”].stringValue
addAsBatch(userList)
我使用 Alamofire 下载大约 7MB 左右的大 json 数据,并使用 RealmSwift 将数据存储在 realmobject 和 SwiftyJSON 以 parse.My 在完成下载后插入领域对象 json 似乎真的很慢 insertion.Was 我的错误代码有问题吗?请指导我。
首先我会展示最简单的 Json :
{
{
"Start" : "40000",
"End" : "1000000",
"Name" : "Smith",
"Address" : "New York"
},{...},more than 7000 records...
}
这是我的 AlamofireAPI 协议
import Foundation
import Alamofire
import SwiftyJSON
protocol RequestDataAPIProtocol{
func didSuccessDownloadingData(results:JSON,statusCode : Int)
func didFailDownloadingData(err : NSError)
}
class RequestDataAPI{
var delegate : RequestDataAPIProtocol
init(delegate: RequestDataAPIProtocol){
self.delegate=delegate
}
func post(requestURL:String,param:[String:String]){
Alamofire.request(.GET, requestURL, parameters: param)
.validate(statusCode: [200,500])
.responseJSON(completionHandler: { (response: Response<AnyObject, NSError>) -> Void in
if let error = response.result.error {
self.delegate.didFailDownloadingData(error)
} else if let jsonObject: AnyObject = response.result.value {
let json = JSON(jsonObject)
self.delegate.didSuccessDownloadingData(json,statusCode: (response.response?.statusCode)!)
}
})
}
func doRequestSiteData(token : String){
post(REQUEST_DATA,param:["data":"All","token":token])
}
}
这是我的领域数据库助手
import Foundation
import RealmSwift
class DBHelper{
func insertUserData(list: UserList){
do {
let realm = try! Realm()
try realm.write({ () -> Void in
realm.add(list,update: true)
})
} catch let error as NSError {
print("Insert Error : \(error)")
}
}
}
这是我的领域模型对象
import Foundation
import RealmSwift
class UserList: Object {
dynamic var start : String = ""
dynamic var end : String = ""
dynamic var name : String = ""
dynamic var address : String = ""
}
和最终代码,视图控制器,
class ViewController : UIViewController , RequestDataAPIProtocol{
var dbHelper = DBHelper()
var requestDataAPI : RequestDataAPI!
override func viewDidLoad() {
super.viewDidLoad()
requestDataAPI = RequestDataAPI(delegate : self)
}
override func viewDidAppear(animated : Bool){
//assume there is one token to request data
requestDataAPI.doRequestSiteData(token)
}
func didSuccessDownloadingData(results: JSON, statusCode: Int){
dispatch_async(dispatch_get_main_queue(), {
print("Downloaded JSON")
switch statusCode{
case 200 :
if results.count > 0{
if let users = results.array {
for user in users{
let userList=UserList()
userList.start=user["Start”].stringValue
userList.end=user[“End”].stringValue
userList.name=user[“Name”].stringValue
userList.address =user[“Address”].stringValue
self.dbHelper.insertUserData(userList)
}
}
}
// took about more than 7 mins
print(“Insertion Done”)
break
case 500,401,400 :
//TODO:
default : break
}
})
}
}
我知道描述所有代码步骤真的很愚蠢,我尽可能简单地编写将 json 数据插入领域 swift 的工作流程。
我只想让所有人都知道我的工作流程在处理这么多 json 数据和插入时是好是坏。
我问这个问题的原因是数据插入需要大约 7 分钟以上才能完成。
所以,我真的需要帮助来优化我的代码。
有指导吗?
更新:我使用 RequestDataAPI 中的委托和协议,我从 JamesQueue 教程中学习了这种风格,因为我完全是初学者,仍在学习 Swift.ViewController 是 updated.That 是我的整个过程细节,没有更多的代码 left.Editing 我的问题或答案感谢代码优化。
insertUserData
方法方法在循环中打开交易这么多次。提交交易是一个有点昂贵的操作。
您可以尝试在循环外向 open/commit 发送交易吗? 也就是说,在进入循环前打开事务,在循环结束后提交一次事务。像下面这样:
if results.count > 0 {
if let users = results.array {
let realm = try! Realm()
try realm.write {
for user in users{
let userList=UserList()
userList.start=user["Start”].stringValue
userList.end=user[“End”].stringValue
userList.name=user[“Name”].stringValue
userList.address =user[“Address”].stringValue
realm.add(userList,update: true)
}
}
}
}
我已使用此代码解决了插入缓慢的问题。
func addAsBatch<T: Object>(_ data: [T]) {
if !isRealmAccessible() { return }
let realm = try! Realm()
realm.refresh()
realm.beginWrite()
for object in data {
realm.add(object)
}
try? realm.commitWrite()
}
显示函数在您的示例中的使用 -
let userList = UserList()
userList.start = user["Start”].stringValue
userList.end = user[“End”].stringValue
userList.name = user[“Name”].stringValue
userList.address = user[“Address”].stringValue
addAsBatch(userList)