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
| 归档时间: |
|
| 查看次数: |
7626 次 |
| 最近记录: |