CSVImporter在viewdidload [Swift]之后开始导入

时间:2017-03-17 15:05:35

标签: swift csv csv-import

我想从.csv文件导入数据,因此我使用了CSVImporter https://github.com/Flinesoft/CSVImporter。它运行良好,但它在执行函数viewDidLoad的其他部分之前开始导入。

以下代码只是一个测试,但我需要一个解决方案,确保CSVImporter在执行其他viewDidLoad代码之前完成导入,或者需要一个在viewDidLoad之后自动启动的函数。

这是我的代码:

var Vokabeln: [[String]]?


var i = 0


override func viewDidLoad() {
    super.viewDidLoad()


    let path = "/Users/---CENSORED---/Documents/TestLöschen/TestLöschen/Vokabeln.csv"
    let importer = CSVImporter<[String]>(path: path, delimiter: ";")
    importer.startImportingRecords { $0 }.onFinish { importedRecords in
        for record in importedRecords {
            self.Vokabeln?[self.i][0] = record[0]
            self.Vokabeln?[self.i][1] = record[1]
            self.Vokabeln?[self.i][2] = record[2]
            print("Begin1")
            print(record[0])
            print(record[1])
            print(record[2])
            print("End1")
            self.i += 1
        }
    }

    print("Begin2")
    print(Vokabeln?[0][0])
    print(Vokabeln?[0][1])
    print(Vokabeln?[0][2])
    print(Vokabeln?[1][0])
    print(Vokabeln?[1][1])
    print(Vokabeln?[1][2])
    print("End2")
}

首先打印“Begin2”,打印6次nil。然后,当函数viewDidLoad完成时,它会打印“Begin1”,然后输出正确的变量和“End1”

任何人都可以帮助我吗? 感谢。

1 个答案:

答案 0 :(得分:0)

startImportingRecords异步工作,只需将代码放在重复循环后的完成处理程序中打印Vokabeln

首先,您需要初始化数组,否则不会附加任何内容。并且不要将数组声明为可选,并且变量名应该以小写字母开头。

var vokabeln = [[String]]()

如果要更新UI,请将调度块中的代码包装起来,例如

importer.startImportingRecords { $0 }.onFinish { importedRecords in
    for record in importedRecords {
        self.vokabeln[self.i][0] = record[0]
        self.vokabeln[self.i][1] = record[1]
        self.vokabeln[self.i][2] = record[2]
        print("Begin1")
        print(record[0])
        print(record[1])
        print(record[2])
        print("End1")
        self.i += 1
    }
    DispatchQueue.main.async {
        print("Begin2")
        print(self.vokabeln[0][0])
        print(self.vokabeln[0][1])
        print(self.vokabeln[0][2])
        print(self.vokabeln[1][0])
        print(self.vokabeln[1][1])
        print(self.vokabeln[1][2])
        print("End2")
   }
}

但还有另一个问题。如果将数组声明为[[String]],则外部和内部数组都为空,并且您无法使用索引下标来分配值。我推荐这种语法

for record in importedRecords {
    self.vokabeln.append(record) // this appends the whole record array
    print("Begin1")
    print(record)
    print("End1")
}

PS:考虑使用更合适的文本格式,如JSON或属性列表。