Swift TableView单元格 - 显示活动微调器,执行功能,隐藏活动微调器

时间:2016-04-30 07:09:19

标签: swift uitableview

我正在Swift中构建一个显示UITableView Cells列表的应用程序。当用户点击一个单元格时,我希望按顺序执行以下操作:

  1. 取消选择索引路径的行
  2. 显示和动画UIActivitySpinner
  3. 执行功能(持续约10秒)
  4. 隐藏UIActivitySpinner

  5. 我目前的代码如下:

         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会消失。

    enter image description here

    目前的问题是UIActivitySpinner仅在myFunction()完​​成执行后才会出现。我不确定如何在myFunction()启动之前显示ActivitySpinner,并在myFunction()完​​成后消失。

    关于myFunction():它是一个在桥接头中链接的C函数,主要是HTTP请求。

1 个答案:

答案 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>