如何更快地下载新闻?

时间:2014-02-21 07:37:31

标签: ios objective-c networking downloading

我有一个UITableViewController类,我在viewDidLoad方法中下载代码。 该代码可以吗?我不确定下载和显示内容。因为显示新闻需要花费大量时间,而且表格滚动滞后。对不起,我是目标C的新手。

@implementation NewsViewController
- (void)viewDidLoad
{


   // _sidebarButton.tintColor = [UIColor colorWithWhite:0.96f alpha:0.2f];
    _sidebarButton.target = self.revealViewController;
    _sidebarButton.action = @selector(revealToggle:);
    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
    [super viewDidLoad];
    [self getJSON];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return currentCellsCount;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    CellForNews *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    id tempObject=[self.arrayOfNews objectAtIndex:indexPath.row];
    cell.publishDate.text=tempObject[@"publish_date"];
    NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:tempObject[@"img_path"]]];
    cell.newsImage.image=[UIImage imageWithData:data];
    cell.descriptionOfThenews.text=tempObject[@"body"];
    cell.titleOfTheNews.text=tempObject[@"publish_title"];

    return cell;
}

-(void)getJSON{

    NSString *path=@"example.com";


    NSURL *url=[NSURL URLWithString:path];

    NSString *dataJSON=[NSString stringWithContentsOfURL:url
                                                encoding:NSUTF8StringEncoding
                                                   error:Nil];

    NSData *data=[dataJSON dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *rootDictionary=[NSJSONSerialization JSONObjectWithData:data
                                                                 options:kNilOptions
                                                                   error:nil];

    NSDictionary *newsDict=[rootDictionary objectForKey:@"publications"];
    id marker=[[NSObject alloc]init];
    self.arrayOfNews=(NSMutableArray*)[newsDict objectsForKeys:[newsDict allKeys] notFoundMarker:marker];
    currentCellsCount=[newsDict allKeys].count;


}

4 个答案:

答案 0 :(得分:3)

  

因为显示新闻需要花费大量时间   您应该考虑预加载数据。

     

并且表格滚动滞后。

这是因为您正在同步进行网络操作,这会阻止负责呈现UI元素的应用程序主线程。因此,您应该发送请求asynchronously

好吧,一旦你理解了基础知识。更好地诉诸一个可以做更多事情的图书馆,比如AFNetworking

  

我有一个UITableViewController类,我在viewDidLoad方法中下载代码。该代码可以吗?

我不能说这不好,不管它有效!但可能不太理想,那为什么会落后?

那么,我是否可以自由地回答您的问题,而是建议更好地设计应用程序的逻辑? 如果是这样,请继续阅读..

什么是viewDidLoad?
  • viewDidLoad是您view controller life cycle的一部分,它会告诉您的视图控制器,“嘿伙计!您的所有视图都已加载并准备好了。现在就把它们搞砸了” 。是!这是你应该对你的观点采取行动的地方。不在你的数据上(除非直接对视图有所作为)。

以下是我们程序员用Seperation Of Concerns的古老技术开悟的地方,全球各地的iOS僧侣采用的一种形式是Model-View-Controller。因此,您应该寻找MVVM之类的路径。

一旦你有这些分离的数据新闻将从你的视图中完全分离,你就可以考虑加快它的加载技术。就像在初始化应用程序时加载它一样,或者使用基于UI的延迟加载模式Pull来刷新或其他任何东西。

答案 1 :(得分:0)

你使用NSOperation队列中的任何一个后台线程,GCD。

延迟加载是一个非常有名的例子,对你提供的内容很有帮助

示例应用

https://developer.apple.com/library/ios/samplecode/LazyTableImages/Listings/Classes_RootViewController_m.html

答案 2 :(得分:0)

这个伟大的指南就是我所需要的。谢谢你的回答!这真的有助于解决我的问题。 http://www.raywenderlich.com/59255/afnetworking-2-0-tutorial

答案 3 :(得分:0)

不要三思而后行。对于任何网络操作,请使用AFnetworking,并使用SDWebImage

进行任何Image Web加载