在 ios 的 UITableView 或 UICollectionView 中重新加载数据的最佳位置是啥

Posted

技术标签:

【中文标题】在 ios 的 UITableView 或 UICollectionView 中重新加载数据的最佳位置是啥【英文标题】:what is the best place to reload data in UITableView or UICollectionView in ios在 ios 的 UITableView 或 UICollectionView 中重新加载数据的最佳位置是什么 【发布时间】:2015-07-20 06:24:25 【问题描述】:

我正在使用 AFNetworking 加载数据。就我而言,我将数据加载到集合视图中。 我在自定义方法中加载数据,并在其中重新加载 collectionview 数据。 我在 viewDidLoad 方法中调用了这个方法。为什么我要问这个,加载数据需要更多时间。我认为这是因为我重新加载collectionview数据的地方。我想知道,我可以通过以viewwillappear或任何其他方法重新加载collectionview数据来加快这个过程。希望你的帮助。谢谢

- (void)viewDidLoad 
    [super viewDidLoad];

    [self loadcategoryData];

    SWRevealViewController *revealcontroller = self.revealViewController;
    if (revealcontroller) 
        [self.sideBarbutton setTarget:self.revealViewController];
        [self.sideBarbutton setAction:@selector(revealToggle:)];
        [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
    

    // Do any additional setup after loading the view.



- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];


    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];



- (void)viewDidAppear:(BOOL)animated

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];


- (void)viewDidDisappear:(BOOL)animated

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];



- (void)viewWillDisappear:(BOOL)animated

    [super viewWillDisappear:animated];

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];





- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (void)loadcategoryData

    post = nil;
    NSString *mainurl = [NSString stringWithFormat:@"some url"];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
    [manager GET:mainurl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 

        posts = (NSDictionary *)responseObject;
        post = [NSMutableArray array];
        for(NSDictionary *all in posts)
        
            Categories *category = [Categories new];
            category.title = [all objectForKey:@"catname"];
            category.firsturl = [all objectForKey:@"url"];

            [self.maincollectionView reloadData];
            //call for images

            imagespost = nil;
            NSString *imageUrl = [NSString stringWithFormat:@"%@", category.firsturl];
            AFHTTPRequestOperationManager *managerone = [AFHTTPRequestOperationManager manager];
            [managerone GET:imageUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 



                imagesposts = (NSDictionary *)responseObject;
                NSArray *resultone = [imagesposts objectForKey:@"posts"];
                imagespost = [NSMutableArray array];
                if ([resultone count]) 
                    NSDictionary *firstpost = resultone[0];
//                    Categories *newmogocat = [Categories new];


                    NSDictionary *thumbnail_images = [firstpost objectForKeyedSubscript:@"thumbnail_images"];
                    NSDictionary *thumbnail = [thumbnail_images objectForKey:@"thumbnail"];
                    category.imageOneUrl = [NSString stringWithFormat:@"%@",[thumbnail objectForKey:@"url"]];
//                    NSLog(@"%@", newmogocat.imageOneUrl);
//                    [imagespost addObject:newmogocat];

                    [post addObject:category];

                    [self.maincollectionView reloadData];
                

             failure:^(AFHTTPRequestOperation *operation, NSError *error) 
//                
//                UIAlertView *erroralert = [[UIAlertView alloc] initWithTitle:@"Something Wrong!" message:[NSString stringWithFormat:@"%@", error.localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
//                [erroralert show];

            ];


        

     failure:^(AFHTTPRequestOperation *operation, NSError * responseObject) 

    ];


- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

    return 1;


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    return [post count];



- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    CategoryCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellidentifier" forIndexPath:indexPath];
//    cell.layer.borderWidth = 2.0f;
    cell.layer.masksToBounds = NO;
    cell.layer.cornerRadius = 5.0;
    cell.layer.borderColor = [UIColor lightGrayColor].CGColor;
    cell.layer.shadowOffset = CGSizeMake(0, 1);
    cell.layer.shadowRadius = 4.0;
    cell.layer.shadowColor = [UIColor darkGrayColor].CGColor;


    [cell addSubview:cell.maintitleLabel];

    Categories *cat = [post objectAtIndex:indexPath.row];
    [self.maincollectionView reloadInputViews];
    cell.maintitleLabel.text = [NSString stringWithFormat:@" %@ ", cat.title];
    [cell.maintitleLabel sizeToFit];






    NSString *mainstring = [NSString stringWithFormat:@"%@", cat.imageOneUrl];
    NSURL *url = [NSURL URLWithString:mainstring];
//
    [cell.mainImageView setImageWithURL:url placeholderImage:nil];
//



    return cell;

【问题讨论】:

【参考方案1】:

您可以开始加载数据的最早时间是在 init 方法中。但老实说,大多数时候他们在彼此之后被如此迅速地调用,你可能甚至不会注意到差异。但是,如果您有兴趣,请在此处输入:

- (id)init

    self = [super init];
    if (self) 
    
        [self loadcategoryData];
    
    return self;

另外我不知道你下载了多少数据,但如果你正在加载一个长列表并且需要很长时间,那么也许你应该考虑进行“分页”(即只下载数据的子部分和然后在用户向下滚动页面时请求更多。

【讨论】:

我怎样才能进行分页,你能告诉我怎么做吗?我是 ios @villy393 的新手 嗯,它更多地取决于提供结果的服务器而不是您。例如,您加载页面,然后请求 20 个结果。当用户滚动超过某个点时,您会请求下一组 20 个结果。所以你需要想出一些方法来告诉你的服务器你想要更多的结果以及你想要的结果页面。检查这个家伙无限滚动项目的代码:github.com/JigarM/Infinite-UIITableview-Scroll(注意它全部在 Swift 中) 或查看jslim.net/blog/2014/04/01/infinite-scroll-using-on-uitableview 仅适用于 swift。无论如何thanx @villy393

以上是关于在 ios 的 UITableView 或 UICollectionView 中重新加载数据的最佳位置是啥的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中嵌入不同数量的项目的 UICollectionViews 索引超出范围

在 ios 的 UITableView 或 UICollectionView 中重新加载数据的最佳位置是啥

用户界面编译器 (Uic) qt3 与 qt4/5,impl 参数等价

iOS UITableView 滑动时顺序混乱或多个cell内容相同

在 UICollectionView/UITableView 中为滚动视图的偏移设置动画会导致单元格过早消失

PyQt5 从 pyuic5 转换文件或 uic.loadUi 调用 gui