From 5f54c6be16ef0c18551d49a7664483945b95e88c Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Tue, 10 Jan 2012 19:36:50 +0200 Subject: [PATCH] Modify PithosNodes to use the global concurrent dispatch queue for ASIPithosRequest delegates. --- pithos-macos/PithosAccountNode.m | 48 +++++++++++++++++++++++------- pithos-macos/PithosContainerNode.m | 48 +++++++++++++++++++++++------- pithos-macos/PithosNode.h | 4 +++ pithos-macos/PithosNode.m | 16 ++++++++++ pithos-macos/PithosObjectNode.m | 24 ++++++++++++--- pithos-macos/PithosSharingAccountsNode.m | 24 +++++++++++---- pithos-macos/PithosSubdirNode.m | 34 +++++++++++++++++---- 7 files changed, 162 insertions(+), 36 deletions(-) diff --git a/pithos-macos/PithosAccountNode.m b/pithos-macos/PithosAccountNode.m index cf798b8..b4f5fcd 100644 --- a/pithos-macos/PithosAccountNode.m +++ b/pithos-macos/PithosAccountNode.m @@ -94,10 +94,13 @@ static NSImage *sharedIcon = nil; if (sharingAccount) [accountRequest setRequestUserFromDefaultTo:sharingAccount]; accountRequest.delegate = self; - accountRequest.didFinishSelector = @selector(accountRequestFinished:); - accountRequest.didFailSelector = @selector(accountRequestFailed:); + accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector", nil]; if (!forcedRefresh) accountRequest.downloadCache = [ASIDownloadCache sharedCache]; @@ -135,13 +138,14 @@ static NSImage *sharedIcon = nil; #pragma mark ASIHTTPRequestDelegate - (void)accountRequestFailed:(ASIPithosAccountRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest]; [(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; [accountRequest release]; accountRequest = newAccountRequest; - [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous]; + [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous]; } else { NSString *message; NSError *error = [accountRequest error]; @@ -150,7 +154,9 @@ static NSImage *sharedIcon = nil; else message = [NSString stringWithFormat:@"Account listing failed: (%d) %@", accountRequest.responseStatusCode, accountRequest.responseStatusMessage]; - [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message]; + dispatch_async(dispatch_get_main_queue(), ^{ + [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message]; + }); [newChildren release]; newChildren = nil; [accountRequest release]; @@ -162,9 +168,11 @@ static NSImage *sharedIcon = nil; freshness = PithosNodeStateRefreshNeeded; } } + [pool drain]; } - (void)accountRequestFinished:(ASIPithosAccountRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"List account finished: %@", [accountRequest url]); NSLog(@"Cached: %d", [accountRequest didUseCachedResponse]); if (accountRequest.responseStatusCode == 200) { @@ -226,10 +234,13 @@ static NSImage *sharedIcon = nil; if (sharingAccount) [accountRequest setRequestUserFromDefaultTo:sharingAccount]; accountRequest.delegate = self; - accountRequest.didFinishSelector = @selector(accountRequestFinished:); - accountRequest.didFailSelector = @selector(accountRequestFailed:); + accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector", nil]; if (!forcedRefresh) accountRequest.downloadCache = [ASIDownloadCache sharedCache]; @@ -250,9 +261,11 @@ static NSImage *sharedIcon = nil; } else { [self accountRequestFailed:accountRequest]; } + [pool drain]; } - (void)accountMetadataRequestFinished:(ASIPithosAccountRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"URL: %@", [request url]); NSLog(@"cached: %d", [request didUseCachedResponse]); @@ -269,9 +282,11 @@ static NSImage *sharedIcon = nil; refreshMetadataAccountRequest = nil; } } + [pool drain]; } - (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if ([request isEqualTo:applyMetadataAccountRequest]) { [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest]; @synchronized(self) { @@ -285,6 +300,7 @@ static NSImage *sharedIcon = nil; refreshMetadataAccountRequest = nil; } } + [pool drain]; } #pragma mark - @@ -300,8 +316,14 @@ static NSImage *sharedIcon = nil; metadata:pithosAccount.metadata update:NO] retain]; applyMetadataAccountRequest.delegate = self; - applyMetadataAccountRequest.didFinishSelector = @selector(accountMetadataRequestFinished:); - applyMetadataAccountRequest.didFailSelector = @selector(accountMetadataRequestFailed:); + applyMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + applyMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + applyMetadataAccountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector", + nil]; [[PithosUtilities prepareRequest:applyMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } } @@ -312,8 +334,14 @@ static NSImage *sharedIcon = nil; if (refreshMetadataAccountRequest == nil) { refreshMetadataAccountRequest = [[ASIPithosAccountRequest accountMetadataRequest] retain]; refreshMetadataAccountRequest.delegate = self; - refreshMetadataAccountRequest.didFinishSelector = @selector(accountMetadataRequestFinished:); - refreshMetadataAccountRequest.didFailSelector = @selector(accountMetadataRequestFailed:); + refreshMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + refreshMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + refreshMetadataAccountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector", + nil]; refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache]; [[PithosUtilities prepareRequest:refreshMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } diff --git a/pithos-macos/PithosContainerNode.m b/pithos-macos/PithosContainerNode.m index cccdd13..15cd662 100644 --- a/pithos-macos/PithosContainerNode.m +++ b/pithos-macos/PithosContainerNode.m @@ -131,10 +131,13 @@ static NSImage *sharedIcon = nil; if (sharingAccount) [containerRequest setRequestUserFromDefaultTo:sharingAccount]; containerRequest.delegate = self; - containerRequest.didFinishSelector = @selector(containerRequestFinished:); - containerRequest.didFailSelector = @selector(containerRequestFailed:); + containerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + containerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); containerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(containerRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(containerRequestFailed:)), @"didFailSelector", nil]; if (!forcedRefresh) containerRequest.downloadCache = [ASIDownloadCache sharedCache]; @@ -193,13 +196,14 @@ static NSImage *sharedIcon = nil; #pragma mark ASIHTTPRequestDelegate - (void)containerRequestFailed:(ASIPithosContainerRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSUInteger retries = [[containerRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { ASIPithosContainerRequest *newContainerRequest = (ASIPithosContainerRequest *)[PithosUtilities copyRequest:containerRequest]; [(NSMutableDictionary *)(newContainerRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; [containerRequest release]; containerRequest = newContainerRequest; - [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous]; + [[PithosUtilities prepareRequest:containerRequest priority:[[containerRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous]; } else { NSString *message; NSError *error = [containerRequest error]; @@ -208,7 +212,9 @@ static NSImage *sharedIcon = nil; else message = [NSString stringWithFormat:@"Container listing failed: (%d) %@", containerRequest.responseStatusCode, containerRequest.responseStatusMessage]; - [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message]; + dispatch_async(dispatch_get_main_queue(), ^{ + [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message]; + }); [newChildren release]; newChildren = nil; [containerRequest release]; @@ -220,9 +226,11 @@ static NSImage *sharedIcon = nil; freshness = PithosNodeStateRefreshNeeded; } } + [pool drain]; } - (void)containerRequestFinished:(ASIPithosContainerRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"List container finished: %@", [containerRequest url]); NSLog(@"Cached: %d", [containerRequest didUseCachedResponse]); if (containerRequest.responseStatusCode == 200) { @@ -340,10 +348,13 @@ static NSImage *sharedIcon = nil; if (sharingAccount) [containerRequest setRequestUserFromDefaultTo:sharingAccount]; containerRequest.delegate = self; - containerRequest.didFinishSelector = @selector(containerRequestFinished:); - containerRequest.didFailSelector = @selector(containerRequestFailed:); + containerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + containerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); containerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(containerRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(containerRequestFailed:)), @"didFailSelector", nil]; if (!forcedRefresh) containerRequest.downloadCache = [ASIDownloadCache sharedCache]; @@ -364,9 +375,11 @@ static NSImage *sharedIcon = nil; } else { [self containerRequestFailed:containerRequest]; } + [pool drain]; } - (void)containerMetadataRequestFinished:(ASIPithosContainerRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"URL: %@", [request url]); NSLog(@"cached: %d", [request didUseCachedResponse]); @@ -384,9 +397,11 @@ static NSImage *sharedIcon = nil; refreshMetadataContainerRequest = nil; } } + [pool drain]; } - (void)containerMetadataRequestFailed:(ASIPithosContainerRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if ([request isEqualTo:applyMetadataContainerRequest]) { [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataContainerRequest]; @synchronized(self) { @@ -400,6 +415,7 @@ static NSImage *sharedIcon = nil; refreshMetadataContainerRequest = nil; } } + [pool drain]; } #pragma mark - @@ -417,8 +433,14 @@ static NSImage *sharedIcon = nil; metadata:pithosContainer.metadata update:NO] retain]; applyMetadataContainerRequest.delegate = self; - applyMetadataContainerRequest.didFinishSelector = @selector(containerMetadataRequestFinished:); - applyMetadataContainerRequest.didFailSelector = @selector(containerMetadataRequestFailed:); + applyMetadataContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + applyMetadataContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + applyMetadataContainerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(containerMetadataRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(containerMetadataRequestFailed:)), @"didFailSelector", + nil]; [[PithosUtilities prepareRequest:applyMetadataContainerRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } } @@ -429,8 +451,14 @@ static NSImage *sharedIcon = nil; if (refreshMetadataContainerRequest == nil) { refreshMetadataContainerRequest = [[ASIPithosContainerRequest containerMetadataRequestWithContainerName:pithosContainer.name] retain]; refreshMetadataContainerRequest.delegate = self; - refreshMetadataContainerRequest.didFinishSelector = @selector(containerMetadataRequestFinished:); - refreshMetadataContainerRequest.didFailSelector = @selector(containerMetadataRequestFailed:); + refreshMetadataContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + refreshMetadataContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + refreshMetadataContainerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(containerMetadataRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(containerMetadataRequestFailed:)), @"didFailSelector", + nil]; refreshMetadataContainerRequest.downloadCache = [ASIDownloadCache sharedCache]; [[PithosUtilities prepareRequest:refreshMetadataContainerRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } diff --git a/pithos-macos/PithosNode.h b/pithos-macos/PithosNode.h index b3b2cea..b8fb28c 100644 --- a/pithos-macos/PithosNode.h +++ b/pithos-macos/PithosNode.h @@ -43,6 +43,7 @@ @class PithosNodeInfoController; @class ASIPithosContainer; @class ASIPithosObject; +@class ASIPithosRequest; @interface PithosNode : NSObject { NSInteger freshness; @@ -91,4 +92,7 @@ - (void)pithosNodeWillBeRemoved; +- (void)performRequestFinishedDelegateInBackground:(ASIPithosRequest *)request; +- (void)performRequestFailedDelegateInBackground:(ASIPithosRequest *)request; + @end \ No newline at end of file diff --git a/pithos-macos/PithosNode.m b/pithos-macos/PithosNode.m index 80d0abd..2439f70 100644 --- a/pithos-macos/PithosNode.m +++ b/pithos-macos/PithosNode.m @@ -38,6 +38,7 @@ #import "PithosNode.h" #import "PithosNodeInfoController.h" #import "ASIDownloadCache.h" +#import "ASIPithosRequest.h" @implementation PithosNode @synthesize forcedRefresh, parent, shared, sharingAccount, displayName, isLeafItem, icon; @@ -143,4 +144,19 @@ } } +#pragma mark - +#pragma mark ASIHTTPRequestDelegate + +- (void)performRequestFinishedDelegateInBackground:(ASIPithosRequest *)request { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + [self performSelector:NSSelectorFromString([request.userInfo objectForKey:@"didFinishSelector"]) withObject:request]; + }); +} + +- (void)performRequestFailedDelegateInBackground:(ASIPithosRequest *)request { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + [self performSelector:NSSelectorFromString([request.userInfo objectForKey:@"didFailSelector"]) withObject:request]; + }); +} + @end \ No newline at end of file diff --git a/pithos-macos/PithosObjectNode.m b/pithos-macos/PithosObjectNode.m index 2c1919f..f089266 100644 --- a/pithos-macos/PithosObjectNode.m +++ b/pithos-macos/PithosObjectNode.m @@ -121,6 +121,7 @@ #pragma mark ASIHTTPRequestDelegate - (void)objectRequestFinished:(ASIPithosObjectRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"URL: %@", [request url]); NSLog(@"cached: %d", [request didUseCachedResponse]); @@ -142,9 +143,11 @@ refreshMetadataObjectRequest = nil; } } + [pool drain]; } - (void)objectRequestFailed:(ASIPithosObjectRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if ([request isEqualTo:applyMetadataObjectRequest]) { [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataObjectRequest]; @synchronized(self) { @@ -158,6 +161,7 @@ refreshMetadataObjectRequest = nil; } } + [pool drain]; } #pragma mark - @@ -190,8 +194,14 @@ update:NO] retain]; } applyMetadataObjectRequest.delegate = self; - applyMetadataObjectRequest.didFinishSelector = @selector(objectRequestFinished:); - applyMetadataObjectRequest.didFailSelector = @selector(objectRequestFailed:); + applyMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + applyMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + applyMetadataObjectRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(objectRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(objectRequestFailed:)), @"didFailSelector", + nil]; [[PithosUtilities prepareRequest:applyMetadataObjectRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } } @@ -205,8 +215,14 @@ if (sharingAccount) [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount]; refreshMetadataObjectRequest.delegate = self; - refreshMetadataObjectRequest.didFinishSelector = @selector(objectRequestFinished:); - refreshMetadataObjectRequest.didFailSelector = @selector(objectRequestFailed:); + refreshMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + refreshMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + refreshMetadataObjectRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(objectRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(objectRequestFailed:)), @"didFailSelector", + nil]; refreshMetadataObjectRequest.downloadCache = [ASIDownloadCache sharedCache]; [[PithosUtilities prepareRequest:refreshMetadataObjectRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } diff --git a/pithos-macos/PithosSharingAccountsNode.m b/pithos-macos/PithosSharingAccountsNode.m index 4dcebd5..4fda9f6 100644 --- a/pithos-macos/PithosSharingAccountsNode.m +++ b/pithos-macos/PithosSharingAccountsNode.m @@ -81,10 +81,13 @@ sharingAccountsRequest = [[ASIPithosRequest listSharingAccountsRequestWithLimit:0 marker:nil] retain]; sharingAccountsRequest.delegate = self; - sharingAccountsRequest.didFinishSelector = @selector(sharingAccountsRequestFinished:); - sharingAccountsRequest.didFailSelector = @selector(sharingAccountsRequestFailed:); + sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); sharingAccountsRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector", nil]; if (!forcedRefresh) sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache]; @@ -116,13 +119,14 @@ #pragma mark ASIHTTPRequestDelegate - (void)sharingAccountsRequestFailed:(ASIPithosRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSUInteger retries = [[sharingAccountsRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue]; if (retries > 0) { ASIPithosRequest *newSharingAccountsRequest = (ASIPithosRequest *)[PithosUtilities copyRequest:sharingAccountsRequest]; [(NSMutableDictionary *)(newSharingAccountsRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"]; [sharingAccountsRequest release]; sharingAccountsRequest = newSharingAccountsRequest; - [[PithosUtilities prepareRequest:sharingAccountsRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous]; + [[PithosUtilities prepareRequest:sharingAccountsRequest priority:[[sharingAccountsRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous]; } else { NSString *message; NSError *error = [sharingAccountsRequest error]; @@ -131,7 +135,9 @@ else message = [NSString stringWithFormat:@"Sharing accounts listing failed: (%d) %@", sharingAccountsRequest.responseStatusCode, sharingAccountsRequest.responseStatusMessage]; - [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message]; + dispatch_async(dispatch_get_main_queue(), ^{ + [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message]; + }); [newChildren release]; newChildren = nil; [sharingAccountsRequest release]; @@ -143,9 +149,11 @@ freshness = PithosNodeStateRefreshNeeded; } } + [pool drain]; } - (void)sharingAccountsRequestFinished:(ASIPithosRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"List sharing accounts finished: %@", [sharingAccountsRequest url]); NSLog(@"Cached: %d", [sharingAccountsRequest didUseCachedResponse]); if (sharingAccountsRequest.responseStatusCode == 200) { @@ -202,10 +210,13 @@ sharingAccountsRequest = [[ASIPithosRequest listSharingAccountsRequestWithLimit:0 marker:[[someSharingAccounts lastObject] name]] retain]; sharingAccountsRequest.delegate = self; - sharingAccountsRequest.didFinishSelector = @selector(sharingAccountsRequestFinished:); - sharingAccountsRequest.didFailSelector = @selector(sharingAccountsRequestFailed:); + sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); sharingAccountsRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector", nil]; if (!forcedRefresh) sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache]; @@ -214,6 +225,7 @@ } else { [self sharingAccountsRequestFailed:sharingAccountsRequest]; } + [pool drain]; } @end diff --git a/pithos-macos/PithosSubdirNode.m b/pithos-macos/PithosSubdirNode.m index 3b9a41b..83e51bb 100644 --- a/pithos-macos/PithosSubdirNode.m +++ b/pithos-macos/PithosSubdirNode.m @@ -130,6 +130,7 @@ static NSImage *sharedIcon = nil; #pragma mark ASIHTTPRequestDelegate - (void)objectRequestFinished:(ASIPithosObjectRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"URL: %@", [request url]); NSLog(@"cached: %d", [request didUseCachedResponse]); @@ -157,9 +158,11 @@ static NSImage *sharedIcon = nil; refreshMetadataObjectRequest = nil; } } + [pool drain]; } - (void)objectRequestFailed:(ASIPithosObjectRequest *)request { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if ([request isEqualTo:applyMetadataObjectRequest]) { [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataObjectRequest]; @synchronized(self) { @@ -173,6 +176,7 @@ static NSImage *sharedIcon = nil; refreshMetadataObjectRequest = nil; } } + [pool drain]; } #pragma mark - @@ -248,8 +252,14 @@ static NSImage *sharedIcon = nil; data:[NSData data]] retain]; pithosObject.subdir = NO; applyMetadataObjectRequest.delegate = self; - applyMetadataObjectRequest.didFinishSelector = @selector(objectRequestFinished:); - applyMetadataObjectRequest.didFailSelector = @selector(objectRequestFailed:); + applyMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + applyMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + applyMetadataObjectRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(objectRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(objectRequestFailed:)), @"didFailSelector", + nil]; [[PithosUtilities prepareRequest:applyMetadataObjectRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } } else { @@ -277,8 +287,14 @@ static NSImage *sharedIcon = nil; update:NO] retain]; } applyMetadataObjectRequest.delegate = self; - applyMetadataObjectRequest.didFinishSelector = @selector(objectRequestFinished:); - applyMetadataObjectRequest.didFailSelector = @selector(objectRequestFailed:); + applyMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + applyMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + applyMetadataObjectRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(objectRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(objectRequestFailed:)), @"didFailSelector", + nil]; [[PithosUtilities prepareRequest:applyMetadataObjectRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } } @@ -295,8 +311,14 @@ static NSImage *sharedIcon = nil; if (sharingAccount) [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount]; refreshMetadataObjectRequest.delegate = self; - refreshMetadataObjectRequest.didFinishSelector = @selector(objectRequestFinished:); - refreshMetadataObjectRequest.didFailSelector = @selector(objectRequestFailed:); + refreshMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:); + refreshMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:); + refreshMetadataObjectRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", + [NSNumber numberWithUnsignedInteger:10], @"retries", + NSStringFromSelector(@selector(objectRequestFinished:)), @"didFinishSelector", + NSStringFromSelector(@selector(objectRequestFailed:)), @"didFailSelector", + nil]; refreshMetadataObjectRequest.downloadCache = [ASIDownloadCache sharedCache]; [[PithosUtilities prepareRequest:refreshMetadataObjectRequest priority:NSOperationQueuePriorityHigh] startAsynchronous]; } -- 1.7.10.4