我怎么知道nsoperation队列何时完成了所有请求,以便我可以重新加载我的tableview?

iMe*_*mon 4 iphone objective-c asihttprequest nsoperationqueue ios5

我正在使用ASIHTTPRequest和NSOperationQueue从不同的链接下载数据

在后台线程下载.请求完成后,我使用requestFinished进行解析

ASIHTTPRequest的委托方法.我希望在所有请求中更新tableview中的数据

队列已经完成.有没有办法知道NSOperationQueue何时处理完所有

要求?我的意思是队列有任何变量,如'isEmpty'或任何委托方法,如'queueDidCompletedAllOperation'?

请帮忙.

这是代码:

//source

@interface SourceModel : NSObject

@property (nonatomic, retain) NSString * link;

@property (nonatomic, retain) NSString * name;

@end


//for rssGroup

@interface CompleteRSSDataModel : NSObject

@property (nonatomic,strong) SourceModel * source;

@property (nonatomic,strong) KissXMLParser * parser;

@property (nonatomic,strong) NSArray * rssArticles;

@end

- (void)viewDidLoad
{
       for (int index=0; index<[rssGroups count]; index++) {

            NSString * urlString = [[[rssGroups objectAtIndex:index] source] link];

            NSURL *url = [NSURL URLWithString:urlString];

            ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self];

            //set this request's tag to group index of this source(link). See requestFinished for use of this :)
            [request setTag:index];

            [self.queue addOperation:request];
        }

}


- (void)requestFinished:(ASIHTTPRequest *)request {

    NSLog(@"%@",@"RSS Data got from internet successfully :))");


    int groupIndex = [request tag];

    CompleteRSSDataModel * group = [rssGroups objectAtIndex:groupIndex];

    group.parser = [[KissXMLParser alloc]initWithData:[request responseData]];

    if (group.parser == nil) {

        NSLog(@"%@",@"Failed - Error in parsing data :((");
    }

    else {
        NSLog(@"%@",@"Data Parsed successfully :))");

        group.rssArticles = [group.parser itemsInRss];

        //So i want to check here that queue is empty, reload data, but as my information, i don't know any method like hasCompletedAllRequested 

        //if(self.queue hasCompletedAllRequests) {

        //     [self.tableview reloadData];
        //}


    }
}

- (void)requestFailed:(ASIHTTPRequest *)request {

    NSLog(@"%@",@"Error in Getting RSS Data from internet:((");

}
Run Code Online (Sandbox Code Playgroud)

Sha*_*a G 10

如果所有操作都已完成,则operations阵列计数将为零.

要检查这一点,您可以使用键值观察编码来观察operations密钥NSOperationQueue

设置密钥的观察者opertions将如下所示:

[self.queue addObserver:self forKeyPath:@"operations" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)

然后在observeValueForKeyPath中执行此操作,如下所示:

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                         change:(NSDictionary *)change context:(void *)context
{
    if (object == self.queue && [keyPath isEqualToString:@"operations"]) {
        if ([self.queue.operations count] == 0) {
            // Do something here when all operations has completed
            NSLog(@"queue has completed");
        }
    }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object 
                               change:change context:context];
    }
}
Run Code Online (Sandbox Code Playgroud)

在iOS 4.0之后,您可以使用该属性operationCount,self.queue.operationCount == 0而不是像这样检查[self.queue.operations count] == 0