将NSOperationQueue作为DataSource发送到UITableView

时间:2014-04-11 06:05:24

标签: ios objective-c uitableview

我编写了使用NSOperationQueueNSOperation从服务器下载数据的代码。现在我想在UserInterface上显示进度。我使用UITableView并使用NSOpeartionQueue作为tableview委托

中的数据源
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   return [[[Downloadmanager sharedInstance] downloadOperationQueue] count];    
}

并将NSOperation的属性绑定到UITableViewCell。

  • 1)这是将NSOperationQueue作为数据源发送到tableview委托的一个简单的解决方案吗?
  • 2)如何在NSOperation状态发生变化时实施重新加载tableview的通知?

感谢。

2 个答案:

答案 0 :(得分:0)

  1. 我不认为这是使用NSOperationQueue作为tableview数据源显示进度的正确方法。您可以使用AFNetworking之类的网络库来下载数据,并使用setDownloadProgressBlock:方法显示进度。请参阅此链接以获取代码download progress

  2. 下载完成后可以轻松重新加载tableview,只需在完成块中调用[tableView reloadData]。

  3. 以下是使用AFNetworking显示图像下载的代码,您可以轻松更改数据下载。(请参阅此gist

     - (void)downloadMultiAFN {
        // Basic Activity Indicator to indicate download
        UIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        [loading startAnimating];
        [self.imageView.superview addSubview:loading];
        loading.center = self.imageView.center;
    
        // Create a request from the url, make an AFImageRequestOperation initialized with that request
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.picUrl]];
        AFImageRequestOperation *op = [[AFImageRequestOperation alloc] initWithRequest:request];
    
        // Set a download progress block for the operation
        [op setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
            if ([op.request.URL.absoluteString isEqualToString:@"http://www.pleiade.org/images/hubble-m45_large.jpg"]) {
                self.progressBar.progress = (float) totalBytesRead/totalBytesExpectedToRead;
            } else self.progressBar2.progress = (float) totalBytesRead/totalBytesExpectedToRead;
        }];
    
        // Set a completion block for the operation
        [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            self.imageView.image = responseObject;
            self.image = responseObject;
            if ([op.request.URL.absoluteString isEqualToString:@"http://www.pleiade.org/images/hubble-m45_large.jpg"]) {
                self.progressBar.progress = 0;
            } else self.progressBar2.progress = 0;
    
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {}];
    
        // Start the image download operation
        [op start];
    
        // Remove the activity indicator
        [loading stopAnimating];
        [loading removeFromSuperview];
    }
    

答案 1 :(得分:0)

这是一个有趣的想法,但我不认为这种“高耦合”是一种很好的做法 - 将模型与视图紧密联系起来。

我将其视为 - 使用NSOperationQueue在后​​台线程上下载数据 - 但是将其保存到某种对象中;说NSMutableArray作为表视图的数据源。

每次单个操作结束时(使用完成处理程序或KVO获取通知) - 更新表视图。更新可以通过两种方式完成 - 重新加载更新。我会将选择留给您 - 您可以在this question中阅读有关该选项的进一步讨论。