NSOperationQueue不取消(删除)操作

时间:2015-02-19 12:05:21

标签: nsoperation nsoperationqueue

我正在寻找一种处理单独但相关的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。我只是想确保它们被取消,而不是让应用程序处于脆弱状态。

0 个答案:

没有答案