从另一个类中查看事件

时间:2015-10-13 11:39:51

标签: ios swift delegates swift2

我有请求的异步任务,我在课程Item中每3秒获取一次产品。

class Item: NSManagedObject {
    var is_fetching:Bool = false;

    func fetchProducts(q: String) {
        let task = session.dataTaskWithRequest(urlRequest, completionHandler: {
              (data, response, error) in
              self.is_fetching = true;
              //some code

              if ((response as! NSHTTPURLResponse).statusCode == 202) {
                  sleep(3)
                  self.fetchProducts(q)
                  return
              }
              if ((response as! NSHTTPURLResponse).statusCode == 200) {
                  self.is_fetching = false;
              }
          })
          task.resume()
      }
}

我有UITableViewController我在其中显示来自回复的数据。当状态代码为200时,如何更新我的单元格:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:
        indexPath) as! CartTableViewCell
    if item.is_fetching {
        cell.fetchIndicator.startAnimating();
    } else {
        cell.fetchIndicator.stopAnimating();
        cell.fetchIndicator.hidden = true;
    }
}

2 个答案:

答案 0 :(得分:0)

使用UITableView重新加载函数之一,可能:

func reloadRowsAtIndexPaths(_ indexPaths: [NSIndexPath],
           withRowAnimation animation: UITableViewRowAnimation)

这将导致它再次询问有问题的细胞。确保在主线程上执行此操作。

答案 1 :(得分:0)

你可以通过几种方式实现。

NSNotificationCenter (最简单)。

您可以发布通知,这将触发您的控制器方法。看起来像这样:

// if response.code == 200
NSNotificationCenter.defaultCenter().postNotificationName("kSomeConstatnString", object: nil)
...
// in viewDidLoad of your controller:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateTable", object: nil)
// you also need implement updateTable() func inside your controller
// or if you need just update table
NSNotificationCenter.defaultCenter().addObserver(self.tableView, selector: "reloadData", object: nil)
// do not forget to delete observer (for instance in -deinit method)
NSNotificationCenter.defaultCenter().removeObserver(self) 
// or tableView. also you can specify for which selector, if you use couple of them.

委托模式。

您可以描述您的协议,让控制器实现此协议并将其作为实例保存在模型对象中。然后只需从委托中调用方法。详情here

阻止回调。

创建操作块并从模型中调用它。例如:

// inside controller
model.refreshCallback = { Void in
  self.tableView.reloadData() // or whatever
}
// inside model
var refreshCallback: (() -> Void)?
...
// if result.code == 200
if let callback = refreshCallback {
  callback()
}