2013-09-29 5 views
8

Cela semble étrange. Je ne peux pas sembler réussir à définir une délégation de file d'attente de NSURLSession à la création.NSURLSession Délégué File d'attente

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    queue.maxConcurrentOperationCount = 5; 

    NSLog(@"The queue before: %@", queue); 
    NSLog(@"Max op Count before: %i", queue.maxConcurrentOperationCount); 

    NSURLSession *session = [NSURLSession sessionWithConfiguration:nil 
                  delegate:self 
                delegateQueue:queue]; 

    NSLog(@"The queue after: %@", session.delegateQueue); 
    NSLog(@"Max op Count after : %i", session.delegateQueue.maxConcurrentOperationCount); 
} 

Il en résulte la sortie suivante.

The queue before: <NSOperationQueue: 0x16d99160>{name = 'NSOperationQueue 0x16d99160'} 
Max op Count before: 5 
The queue after: <NSOperationQueue: 0x16d77a50>{name = 'NSOperationQueue 0x16d77a50'} 
Max op Count after : 1 

Il semble que mon delegateQueue soit ignoré. J'ai essayé sur l'appareil ainsi que sur le simulateur. Je n'ai trouvé aucune documentation qui pourrait expliquer cela. Quelqu'un at-il une idée?

Répondre

5

Il semble que, malgré ce que dit le getter pour delegateQueue, le NSURLSession utilise en effet votre NSOperationQueue. J'ai ajouté KVO pour la propriété "opérations" sur la file d'attente:

[queue addObserver:self forKeyPath:@"operations" options:NSKeyValueObservingOptionNew context:NULL]; 

et a ajouté la méthode suivante:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSLog(@"%@%@", object, change); 
    NSOperationQueue *queue = (NSOperationQueue *)object; 

    NSLog(@"The queue in KVO: %@", queue); 
    NSLog(@"Max op Count in KVO: %i", queue.maxConcurrentOperationCount); 

    NSLog(@"%@", self.session.delegateQueue); 

} 

Et il imprime:

2013-09-29 07:45:13.751 sotest1[17214:1403] <NSOperationQueue: 0x895e0c0>{name = 'NSOperationQueue 0x895e0c0'} 
2013-09-29 07:45:13.757 sotest1[17214:4207] <NSOperationQueue: 0x98a0940>{name = 'NSOperationQueue 0x98a0940'}{ 
    kind = 1; 
    new =  (
     "<NSBlockOperation: 0x9a52370>" 
    ); 
} 
2013-09-29 07:45:13.757 sotest1[17214:4207] The queue in KVO: <NSOperationQueue: 0x98a0940>{name = 'NSOperationQueue 0x98a0940'} 
2013-09-29 07:45:13.757 sotest1[17214:4207] Max op Count in KVO: 5 

vous pouvez donc voir le délégué est en effet traité par votre file d'attente, malgré le fait que le getter dise le contraire. Bizarre.

BTW, la façon dont vous le faire est aussi exactement AFNetworking il le fait, ce qui est généralement un bon signe: https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLSessionManager.m#L287

2

Je confirme le problème de mon côté j'ai essayé de définir une file d'attente de 1 élément que vous fait en utilisant la maxConcurrentOperationCount = 1 sur la session, je vois plusieurs tâches en cours d'exécution dans le même temps que décrit par le dessous enregistré dans le (URLSession: didWriteData: totalBytesWritten):

NSLog(@"Download %.2f%% task=%d - operationInQueue=%d maxOperation=%d ", result, [downloadTask taskIdentifier], [self.bkgQueue operationCount],[self.bckQueue maxConcurrentOperationCount]); 

Download 1.80% task=2 - operationInQueue=2 maxOperation=1 
Download 1.15% task=1 - operationInQueue=1 maxOperation=1 
Download 1.49% task=1 - operationInQueue=1 maxOperation=1 
Download 1.51% task=1 - operationInQueue=1 maxOperation=1 
Download 1.14% task=0 - operationInQueue=1 maxOperation=1 
Download 3.90% task=2 - operationInQueue=2 maxOperation=1 
Download 1.14% task=0 - operationInQueue=1 maxOperation=1 
Download 1.85% task=1 - operationInQueue=1 maxOperation=1 
Download 1.87% task=1 - operationInQueue=1 maxOperation=1 

J'ai essayé aussi d'augmenter ce nombre et compte sur ma file d'attente = 1. Il semble qu'il gère lui-même la file d'attente.

Questions connexes