Ios 是否可以在加载视图的同时加载UICollectionView中的自定义单元格?

Ios 是否可以在加载视图的同时加载UICollectionView中的自定义单元格?,ios,objective-c,uicollectionview,uicollectionviewcell,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我是iOS新手,似乎遇到了UICollectionView问题 我正在尝试制作一个选项卡栏应用程序,其第一个选项卡是包含集合视图的导航控制器。海关单元的内容(图像、文本)来自web服务。由于下载web服务上的内容需要时间,我希望应用程序启动后立即显示单元格,而不必等待数据加载(,这意味着在加载数据之前)。因此,当屏幕上只有空单元格(&tab栏和导航栏)时,时间会很短 但是,当我的应用程序运行时,单元格会在从web服务加载所有数据的同时创建。有时,当互联网速度较慢时,在加载包含数据的单元格之前,屏

我是iOS新手,似乎遇到了UICollectionView问题

我正在尝试制作一个选项卡栏应用程序,其第一个选项卡是包含集合视图的导航控制器。海关单元的内容(图像、文本)来自web服务。由于下载web服务上的内容需要时间,我希望应用程序启动后立即显示单元格,而不必等待数据加载(,这意味着在加载数据之前)。因此,当屏幕上只有空单元格(&tab栏和导航栏)时,时间会很短

但是,当我的应用程序运行时,单元格会在从web服务加载所有数据的同时创建。有时,当互联网速度较慢时,在加载包含数据的单元格之前,屏幕上很长一段时间都没有显示任何内容。我想知道是否有人能告诉我我做错了什么。提前非常感谢

以下是集合视图控制器实现文件中我的viewDidLoad:方法的代码:

- (void)viewDidLoad
{

    [super viewDidLoad];

    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame
                                             collectionViewLayout:layout];
    [self.collectionView setDataSource:self];
    [self.collectionView setDelegate:self];
    [self.collectionView setBackgroundColor:[UIColor whiteColor];

    layout.sectionInset = UIEdgeInsetsMake(0, 5, 10, 5);
    layout.minimumLineSpacing = 5;

    UINib *nib = [UINib nibWithNibName:@"TDEFeedCollectionViewCell" bundle:nil];
    [self.collectionView registerNib:nib forCellWithReuseIdentifier:@"feedCell"];

}
我是否应该改为在
loadView:
方法中执行上述实现,并将已配置的
UICollectionView
对象分配给集合视图控制器的
view
属性,以便在调用
loadView:
方法后立即加载单元格

多谢各位

---编辑--- 以下是控制器初始值设定项的实现:

- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout
{
    self = [super initWithCollectionViewLayout:layout];
    if (self) {
    self.navigationItem.title = @"News Feeds";

    _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                                             delegate:nil
                                        delegateQueue:nil];
    [self fetchFeed];
    }
return self;
}
- (void)fetchFeed
{
    NSString *requestString = @"http://exampleapi.exampleweb.com/feeds.json";
    NSURL *url = [NSURL URLWithString:requestString];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];

    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:req
                                                     completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data
                                                                                                 options:0
                                                                                                   error:nil];

                                      self.feeds = jsonObject[@"feeds"];

                                      dispatch_async(dispatch_get_main_queue(), ^{
                                          [self.collectionView reloadData];
                                      });
                                  }];
[dataTask resume];
}
下面是初始化器中使用的
-(void)fetchFeed
方法的实现:

- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout
{
    self = [super initWithCollectionViewLayout:layout];
    if (self) {
    self.navigationItem.title = @"News Feeds";

    _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                                             delegate:nil
                                        delegateQueue:nil];
    [self fetchFeed];
    }
return self;
}
- (void)fetchFeed
{
    NSString *requestString = @"http://exampleapi.exampleweb.com/feeds.json";
    NSURL *url = [NSURL URLWithString:requestString];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];

    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:req
                                                     completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data
                                                                                                 options:0
                                                                                                   error:nil];

                                      self.feeds = jsonObject[@"feeds"];

                                      dispatch_async(dispatch_get_main_queue(), ^{
                                          [self.collectionView reloadData];
                                      });
                                  }];
[dataTask resume];
}

在数据源方法中,我只是使用在
-(void)fetchFeed
方法中解析的JSON数据,并将它们分配给适当的单元格视图。

苹果公司有一个照片网格视图示例项目,该项目使用智能缓存动态加载资产

如果我是你,我会考虑从这开始,然后用你自己的Web服务调用替换照片LIB调用应该是微不足道的。
这个项目给了你很多免费的东西-相信我,在我看到这个页面之前,我几乎是从头开始写了一些类似的东西。

对不起,阿伦利,我完全误解了这个问题

您想要的解决方案(我认为)是在下载完成之前用一些空白数据预先填充
self.feed
,下载完成后,更新数组并重新加载
self.collectionView

试着加上这个

self.feeds = [NSArray arrayWithCapacity:10]; // or any other number you want
[self.collectionView reloadData];
之后

-viewDidLoad
方法中,查看是否有帮助

当然,问题在于,在下载完成之前,您不知道要显示的单元格数量,因此您必须猜测或使用任意数字来解决


注意:注意这种方法,因为它可能会崩溃,因为单元格可能希望在
self.feeds
中找到一些数据。您需要确保单元格准备好获取空白数据。

如果您想在下载完成后显示
self.collectionView
,可以通过将
self.collectionView
的alpha设置为0,并在下载完成后将其设置为1来实现。例如,嗨,Gyfis!非常感谢您的回复!实际上,我希望在应用程序启动时立即显示单元格,而不必等待web数据加载。我该怎么做?非常感谢。如何/在何处提取要在单元格中显示的数据?是否希望在提取过程中显示一些占位符内容?您知道被检索对象的数量吗?或者,您是否希望在第一次启动时不显示任何内容,然后在启动后显示上次查询的结果?无论您决定做什么,viewDidLoad都可以。(顾名思义,它是在加载视图后调用的,而不是在加载过程中)!谢谢你的回复!我已经更新了我的问题。我已经包括了我的初始值设定项和一个相关的自定义方法的实现。当互联网速度变慢时,在加载包含数据的单元格之前,可能会有很长一段时间屏幕上什么都没有。我想在第一次启动时显示空单元格,然后显示来自web服务的查询结果!谢谢你的回复!我的内容纯粹来自互联网。我想在第一次启动时显示空单元格,然后显示来自web服务的查询结果。然而,在我当前的实现中,在加载web服务器的内容之前,屏幕上可能会有很长一段时间没有任何内容(没有单元格)。如何在启动时立即显示空单元格?非常感谢。如果您的解决方案基于引用的示例项目,则可以立即显示空网格视图,并在数据进入时填充单元格。苹果的例子适用于网络图像(iCloud),所以你可以根据自己的需要利用它。