gpt4 book ai didi

swift - 创建 csv 文件时的事件指示器

转载 作者:行者123 更新时间:2023-11-28 08:11:20 25 4
gpt4 key购买 nike

我试图在创建 csv 文件时显示事件指示器,但它没有显示。我猜我应该以某种方式使用 dispatch_async,但我不知道如何在 swift 3 中执行此操作。

var activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)

override func viewDidLoad() {
super.viewDidLoad()

// activity indicator
activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 100 ,y: 200,width: 50,height: 50)) as UIActivityIndicatorView
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
activityIndicator.center = self.view.center
self.view.addSubview(activityIndicator)
}

func writeToCsv() {

self.activityIndicator.startAnimating() // start the animation

let fileName = "events.csv"
let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)

var csvText = self.name! + "\n"
csvText += "Date,Start time,End time\n"

// create rest of comma-separated string
for event in self.events! {

let newLine = "\(event.date),\(event.startTime),\(event.endTime)\n"
csvText.append(newLine)
}

// write to csv
do {
try csvText.write(to: path!, atomically: true, encoding: String.Encoding.utf8)
} catch {
print("Failed to create file")
print(error)
}

// create and present view controller with send options
let vc = UIActivityViewController(activityItems: [path as Any], applicationActivities: [])
self.present(vc, animated: true, completion: nil)
self.activityIndicator.stopAnimating() // stop the animation
}

最佳答案

呃,好吧,如果没有更多关于您的 View 设置的上下文,很难回答这个问题。首先,确保您的事件指示器在不调用 writeCsv 方法的情况下可见,这样您就知道您的 View 层次结构是正确的。 (即可能是它隐藏在其他一些 subview 后面)

接下来,在 Swift3 中,Dispatch 已更改为更新的 API。我不确定他们是否在 OSX 上使用 raw libdispatch Swift wrapper ,但无论如何您都可以像这样访问它:

后台默认队列:

DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { /* code */ }

主线程:

DispatchQueue.main.async { /* Mainthread code ( UIKit stuff ) */ }

您自己的 CSV 生成 block 自定义队列:

let queue = DispatchQueue(label: "csvgenerator.queue")
queue.async { /* code */ }

现在对于你的动画/停止动画,确保你从主线程调用你的 UIKit 相关代码以防止奇怪的 glitechs 和/或崩溃

即:

DispatchQueue.main.async {
self.activityIndicator?.startAnimating()
}

另一个好主意可能是改用 NSOperationQueue。我相信它在内部使用 GCD,但它确实很好地集成到 iOS 中并且可能使一些调度更容易实现。我自己总是使用 GCD,但我从来没有真正需要完成很长的工作。 NSOperationQueue 的优点之一是它在取消调度 block 方面更加用户友好。

Dave Delong 编写的 WWDC 应用程序中有关 NSOperationQueue 的有趣 session 视频:WWDC Videos 2015

我将对您的 writeCSV 方法进行一些小改动:

guard let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName) else {
// Should throw an error here, or whatever is handy for your app
return
}

尽可能避免在所有阶段强制解包。在具有此功能的方法中,例如,您可以将“throws”添加到函数定义的末尾,这样您就可以在没有 do 和 catch block 的情况下使用 try,同时还能够在 guard 语句中抛出错误,以便任何调用 writeCsv 都可以捕获错误并更轻松地将其显示给用户。

关于swift - 创建 csv 文件时的事件指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43677095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com