我编写了使用NSOperationQueue
和NSOperation
从服务器下载数据的代码。现在我想在UserInterface
上显示进度。我使用UITableView
并使用NSOpeartionQueue
作为tableview委托
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[[Downloadmanager sharedInstance] downloadOperationQueue] count];
}
并将NSOperation的属性绑定到UITableViewCell。
NSOperationQueue
作为数据源发送到tableview委托的一个简单的解决方案吗?NSOperation
状态发生变化时实施重新加载tableview的通知?感谢。
答案 0 :(得分:0)
我不认为这是使用NSOperationQueue
作为tableview数据源显示进度的正确方法。您可以使用AFNetworking之类的网络库来下载数据,并使用setDownloadProgressBlock:方法显示进度。请参阅此链接以获取代码download progress。
下载完成后可以轻松重新加载tableview,只需在完成块中调用[tableView reloadData]。
以下是使用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中阅读有关该选项的进一步讨论。