我正在寻找一种处理单独但相关的NSURLRequest的方法,并认为我可以将它们添加到NSOperationQueue然后管理它们(如果状态代码是200,则运行请求或不基于http状态代码)他们可以运行,如果没有,则停止所有这些,因为需要追加url字符串)。
在我下面的测试代码中,我暂停OQ以停止处理NSURLRequest(这里由一些公共RSS提要表示),但继续向OQ请求。我得到了正确的操作次数(4)。将所有请求添加到OQ后,然后检查它是否已被暂停,如果是,则取消所有操作。这有效,至少检查是否已被暂停。
当我取消操作后进行计数检查时,我仍然得到4但是期望更少(并且希望为0)。我使用NSURLConnection来获取NSObject子类中的rss数据。
我从文档中了解到NSOQ在报告完成之前不会删除操作。 (有没有办法看到这份报告?) 添加后,无法直接从队列中删除操作。操作将保留在其队列中,直到它报告已完成其任务。完成其任务并不一定意味着操作执行该任务完成。也可以取消操作。取消操作对象会将对象留在队列中,但会通知对象它应该尽快中止其任务。
NSURLConnection没有一个willStart或类似的委托方法,所以我无法跟踪,但我的感觉是第二个RSS提要是在某种启动过程中,这可以解释为什么它仍然在那里。但是我记录了connectionDidFinishLoading委托,所以第一个任务完成了,所以我期待至少那个消失了。
所以我的问题是双重的。 如果我把NSOQ排除在外,是否会消除其中的操作?如果其中一个操作正在进行中有什么危险 - 崩溃,挂起应用程序等? 2.有没有办法取消正在进行的NSURLConnection? (假设1的答案是肯定的,那么你处于危险区域)。
这是我的代码:
- (void)viewDidLoad {
[super viewDidLoad];
connectionManager* myConnectionManager = [[connectionManager alloc] init];
NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init];
NSMutableArray* arrAddedOperations = [[NSMutableArray alloc] init];
NSArray* arrFeeds = [[NSArray alloc] initWithObjects:@"http://rss.cnn.com/rss/cnn_topstories.rss", @"http://hosted.ap.org/lineups/USHEADS-rss_2.0.xml?SITE=RANDOM&SECTION=HOME", @"http://feeds.reuters.com/reuters/topNews", @"http://newsrss.bbc.co.uk/rss/newsonline_world_edition/americas/rss.xml", nil];
//add operations to operation queue
for(int i=0; i<arrFeeds.count; i++) {
NSInvocationOperation* rssOperation = [[NSInvocationOperation alloc]
initWithTarget: myConnectionManager
selector:@selector(runConnection:)
object:[arrFeeds objectAtIndex:i]];
//check to put a suspension on the OQ
if (i>1) {
operationQueue.suspended = YES;
}
[operationQueue addOperation:rssOperation];
[arrAddedOperations addObject:[arrFeeds objectAtIndex:i]];
//incremental count to see operations being added to the queue - should be 4
NSLog(@"This is the number of operations added to the queue:%i", [operationQueue operationCount]);
}
if (operationQueue.suspended) {
//restart the OQ so we can cancel all the operations
operationQueue.suspended = NO;
//kill all the operations
[operationQueue cancelAllOperations];
//count to see how many operations are left
NSLog(@"OQ has been suspended and operations canclled. The operation count should be 0\nThe operation count is %i", [operationQueue operationCount]);
}
}
来自NSURLConnection类
- (void) runConnection : (NSString*) strURL {
NSURLRequest* urlRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:strURL]];
self.myConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self startImmediately:NO];
[self.myConnection setDelegateQueue:self.myQueue];
[self.myConnection start];
self.myConnection = nil;
}
#pragma mark - NSURLConnection Delegates
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"%@", error.localizedDescription);
}
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
NSLog(@"%@", [NSNumber numberWithInteger:httpResponse.statusCode]);
}
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
self.strReponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//NSLog(@"%@", self.strReponse);
}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"task finished");
NSDictionary* dictUserInfo = [[NSDictionary alloc] initWithObjectsAndKeys:
@"Display Data", @"Action",
self.strReponse, @"Data",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"avc" object:self userInfo:dictUserInfo];
}
编辑:我不需要保存这些操作,因为我将传入的请求存储在一个可变数组中,并且一旦添加了它就会创建一个新的OQ。我只是想确保它们被取消,而不是让应用程序处于脆弱状态。