2013-02-25 16 views
8

wiem, to pytanie wiele razy pytano o to, ale nie udało mi się, aby to działało w moim projekcie ...iOS - asynchroniczny NSURLConnection wewnątrz NSOperation

Tak, chcę podklasy NSOperation i uczynić go pobierz plik, używając NSURLConnection. Jak to zrobić? tutaj jest mój kod, który nie działa: Najpierw Dodaję wszystkie swoje operacje w pętli:

DownloadFileOperation *operation; 
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
for (int i=0; i<10; i++) { 
operation = [[DownloadFileOperation alloc] init]; 
operation.urlString = pdfUrlString; 
[queue addOperation:operation]; 
operation = nil; } 

I tu jest mój podklasy:

@interface DownloadHandbookOperation : NSOperation <NSURLConnectionDelegate> 
{ 

} 

@property (strong, nonatomic) NSString *urlString; 

@end 


@implementation DownloadHandbookOperation 
{ 
    NSString *filePath; 
    NSFileHandle *file; 
    NSURLConnection * connection; 
} 

- (void)start 
{ 
    if (![NSThread isMainThread]) 
    { 
     [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO]; 
     return; 
    } 

    NSURL *url = [[NSURL alloc] initWithString:[self.urlString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; 

    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; 
    [req addValue:@"Basic ***=" forHTTPHeaderField:@"Authorization"]; 
    connection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES]; 

} 

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response 
{ 
    NSString *filename = [[conn.originalRequest.URL absoluteString] lastPathComponent]; 
    filename = [filename stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

    filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:filename]; 
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil]; 

    file = [NSFileHandle fileHandleForUpdatingAtPath:filePath] ; 
    if (file) 
    { 
     [file seekToEndOfFile]; 
    } 
    else 
     [self finish]; 
} 

- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data 
{ 
    if (file) { 
     [file seekToEndOfFile]; 
    } 
    [file writeData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)conn 
{ 
    [file closeFile]; 
    [self finish]; 
} 

- (void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error 
{ 
    connection = nil; 

    [self finish]; 
} 

- (void)cancel 
{ 
    [super cancel]; 
    [connection cancel]; 
} 


- (void)finish 
{ 
    NSLog(@"operationfinished."); 
} 


@end 

Co robię źle ?

+0

myślę 'NSURLConnection' musi być wywoływana z głównego wątku, to nie robi cokolwiek, jeśli zostanie wywołany z wątku w tle ... Nawet jeśli jest wywoływany z głównego wątku, nadal działa w tle w sieci, a następnie ponownie wywołuje funkcje delegata z głównego wątku ... – jjv360

+0

Dobrze, więc jak można Sprawię, że moja NSOperacja zostanie wykonana na głównym wątku? – Oleg

+0

Wypróbuj '[[NSOperationQueue mainQueue] addOperation: operation]' ... – jjv360

Odpowiedz

8

trzeba poprawnie skonfigurować swoją pracę do wykonania jako „równoczesnej pracy”

Concurrency Programming Guide: Configuring Operations for Concurrent Execution

Trzeba powrócić isConcurrent = YES i prawidłowo zarządzać inne flagi państwowe, isExecuting i isFinished w sposób zgodny KVO.


Aby zilustrować ogólne pojęcie o to post od inżynierów na Pulse, który opisuje swoje rozwiązanie z niektórymi łatwe do naśladowania demo kod można pobrać i sprawdzić.

Pulse Engineering Blog: Concurrent Downloads using NSOperationQueues **

Kod ten obsługuje również wymóg NSURLConnection jest uruchamiany na nitkę z aktywnym runloop poprzez zapewnienie, że zaczyna go na głównym wątku.

(** Link jest teraz do archive.org, myślę, że impuls został nabyty i miały swoje stare miejsce dół)

+0

Dziękuję za link, pomógł! – Oleg

+0

Dzięki za odpowiedź :-) – Arkan

+0

link uszkodzony. :( – Suz

Powiązane problemy