Iphone 添加观察者问题,尝试检查是否加载了数据

Iphone 添加观察者问题,尝试检查是否加载了数据,iphone,objective-c,ipad,Iphone,Objective C,Ipad,我有一个ViewController,它初始化另一个类,该类将数据加载到可变数组中,并将其保存为自身的属性 以下是我的ViewController初始化代码: -(id) initWithCollectionID:(NSString *)aCollectionID { if (self = [super init]){ collectionID=aCollectionID; dataSource = [[CollectionListDataSource a

我有一个ViewController,它初始化另一个类,该类将数据加载到可变数组中,并将其保存为自身的属性

以下是我的ViewController初始化代码:

-(id) initWithCollectionID:(NSString *)aCollectionID {
    if (self = [super init]){
        collectionID=aCollectionID;
        dataSource = [[CollectionListDataSource alloc] initWithCollectionID:collectionID];
    }
    return self;
}
一旦dataSource将所有数据加载到其属性dataSource.collectionItems中,我就设置dataSource.loaded=@“true”

如何使用addObserver查看该值并在ViewController中启动函数

我想是这样的:

[self addObserver:dataSource forKeyPath:@"loaded" options:NSKeyValueChangeNewKey context:nil];

那么我该怎么办呢?

由于您的代码现在处于运行状态,无论您是否使用通知,它都将暂停,直到数据加载为止。它不会超越:

dataSource = [[CollectionListDataSource alloc] initWithCollectionID:collectionID];
…直到
CollectionListDataSource
对象完成其自身的初始化(我认为这也意味着加载其数据)并返回其自身的实例

如果希望在视图控制器继续初始化时加载
CollectionListDataSource
对象,则需要将
CollectionListDataSource
对象放在另一个线程上。但是,不能在单独的线程上运行属性对象

你很少需要跳过这样的障碍。除非此阵列非常大(10k+对象),否则您很可能不必担心。在大多数情况下,在视图能够正常工作之前,您需要数据,因此让视图在没有数据的情况下继续工作是没有意义的


如果确实需要观察另一个对象的属性,请参见以获取详细信息

它使用非阻塞的NSURLRequest与web服务进行对话,因此它实际上根本不会暂停,这就是我希望查看加载并在获得数据后刷新的问题。您必须将CollectionListDataSource停在其他位置,并/或让它在init以外的其他方法中加载数据。现在,代码将停止初始化视图,直到加载数据为止。您需要在后台线程中加载数据,并在线程完成时通知视图控制器。请尝试此示例。这是核心数据,但原理是一样的: