我正在Swift中构建一个显示UITableView Cells列表的应用程序。当用户点击一个单元格时,我希望按顺序执行以下操作:
我目前的代码如下:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
let cell = tableView.cellForRowAtIndexPath(indexPath) as! TableViewCell
cell.ActivitySpinner.startAnimating()
myFunction() // Approximately 10 seconds.
cell.ActivitySpinner.stopAnimating()
return
}
所以我的想法是,当myFunction()执行时,UIActivitySpinner会出现10秒钟,当myFunction()结束时,UIActivitySpinner会消失。
目前的问题是UIActivitySpinner仅在myFunction()完成执行后才会出现。我不确定如何在myFunction()启动之前显示ActivitySpinner,并在myFunction()完成后消失。
关于myFunction():它是一个在桥接头中链接的C函数,主要是HTTP请求。
答案 0 :(得分:2)
首先,一般来说,使用大写字母的第一个字母不是最佳做法。
如果您创建一个像网络调用一样的异步线程,那么下面这不是最佳解决方案。 你可以使用这个功能(我不推荐这个):
func dispatchDelay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
..并且做:
cell.ActivitySpinner.startAnimating()
myFunction() // Approximately 10 seconds.
dispatchDelay(10.0) {
cell.ActivitySpinner.stopAnimating()
}
我建议您这样做:
您必须向C函数添加完成处理程序,如下例所示:
void myFunction(std::string urlStr, std::function<void(std::string)> callback)
{
...
NSURLSessionDataTask* dataTask =
[defaultSession
dataTaskWithURL:url
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil)
{
NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"Data = %@",text);
// invoke the callback here...
callback(std::string([text UTF8String]));
}
}];
...
}
在C中你可以使用它:
void callbackFunc(std::string data)
{
...
}
myFunction("...", callbackFunc);
您现在需要构建的是跨平台C - &gt; Swift,如果你不知道它,你可以按照这些指示&#34; Building cross platform aint easy&#34;:这可以允许你将回调集成到你的swift代码中来处理确切的myFunction开始时间和结束时间。 / p>