检查NSMutableArray中从NSURLConnection填充的自定义对象的完成情况

时间:2012-12-03 17:42:28

标签: objective-c nsarray nspredicate

首先,非常感谢SO社区。我学到了很多东西。但是,对于Objective C,我仍然是一个极端的新手,因此有一个问题。如果这是一个无知的问题,请提前道歉。

我已经将NSURLConnection子类化为从我的Web API获取自定义对象(myObject)。每个对象需要2次调用API才能完成。第一个调用是从我的对象列表中获取一个id属性。第二个调用是使用该id来构造不同的URL并填充myObject属性的其余部分。一切都运行良好,但我对我重新加载tableViewsection based on a completion of all of the myObject objects within an NSMutableArray`的方法的正确性有疑问。

以下是我成功实例化并获取所有不完整的myObjects并将其添加到NSMutableArray后调用的方法。 messageStringmyObject的属性,仅在myObject的每个实例的第二次网络调用中可用/设置。因此,我想我会用它来检查完整性。 arrayOfMyObjects是可变的,包含所有不完整的myObjectsMyStoreClass就是这样。处理子类NSURLConnections的创建的商店。

- (void)fetchDetails {

void (^completionBlock)(myObject *obj, NSError *err, int statusCode) = ^(myObject *obj, NSError *err, int statusCode) {

    if (!err && statusCode == 200) {

        NSArray *completionCheckArray = [arrayOfMyObjects filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"messageString = %@", [NSNull null]]];

        if ([completionCheckArray count] == 0) {
            [[self tableView] reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationAutomatic];
        }


    } else if (!err && statusCode != 200) {
        [self statusCodeError:statusCode];
    } else {
        [self generalError:err];
    }
};

    for (myObject *mobj in arrayOfMyObjects) {
    [[MyStoreClass sharedStore] fetchDetails:mobj withCompletion:completionBlock];
    }
}

虽然这是有效的,但我必须通过完成块为myObjects的每一个创建一个数组。如果是这样,那么检查所有myObjects完成的替代方法是什么?

1 个答案:

答案 0 :(得分:2)

一种可行且可行的方法是采用KVO(Key Value Observing)。查看相应的Key-Value Observing Programming Guide

例如:如果您知道您希望从给定的服务呼叫中有多少个对象(即对象计数), 您可以在持有对象的数组对象上挂接观察者,并在添加元素时收到通知。 请参阅Observing an NSMutableArray for insertion/removal