2013-04-09 11 views
0

Мне нужно загрузить изображение в webservice. Ниже приведен фрагмент кода, который я вернул для загрузки изображения. Размер изображения очень большой (около 6 Мб). Я загружаю это изображение в фоновый поток с помощью GCD.Загрузка большого изображения в фоновом режиме.

 if([VSCore ConnectedToInternet ]) 
     { 
     bgTask = [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler: ^{ 
          dispatch_async(dispatch_get_main_queue(), ^{ 
           //[application endBackgroundTask:self->bgTask]; 
           //self->bgTask = UIBackgroundTaskInvalid; 
          }); 
         }]; 

         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

          [vrs write:data toURI:URI]; 

          [[UIApplication sharedApplication]endBackgroundTask:bgTask]; 
          bgTask = UIBackgroundTaskInvalid; 
         }); 

//
}

-(BOOL)write:(NSData *)data toURI:(NSString *)URI 
{ 
BOOL retVal = NO; 
NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [data length]]; 

NSRange range = [URI rangeOfString:@"http"];//Is http? 
if(range.location != NSNotFound) 
{ 
    //Yes, http 
    NSMutableURLRequest *httpRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:URI]]; 

    [httpRequest setHTTPMethod:@"POST"]; 
    [httpRequest setHTTPBody:data]; 
    [httpRequest setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; 
    [httpRequest setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"]; 

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:httpRequest delegate:self]; 

    [theConnection release]; 
    [httpRequest release]; 

    if (theConnection) 
    { 
     receivedData=[[NSMutableData data] retain]; 
     retVal = YES; 
    } 
    else 
    {            
     NSError *error = [NSError alloc]; 
     NSLog(@"Connection failed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
      [error release]; 

     retVal = NO; 
    } 

}            
return retVal; 

}

теперь проблема я столкнулся это, если я пытаюсь загрузить изображение в фоновом потоке запрос не собирается на сервер (Я проверяю файл журнала на сервере). но если я загружу изображение в главной теме, запрос будет на сервере (только для целей тестирования я знаю, что его не очень хорошая идея загружать большие изображения в основной поток). Так что я делаю неправильно здесь? есть ли проблема с Background Threading? Plz Помогите мне. Заранее спасибо.

ответ

1

Вместо того чтобы делать это на фоне нити. вы можете создать класс, который делает ваши сетевые соединения, как это.

Вам просто нужно добавить в полях, чтобы опубликовать свое изображение.

- (void)send: (NSString *)urlString { 

self.receivedData = [[NSMutableData alloc] init]; 

NSURLRequest *request = [[NSURLRequest alloc] 
         initWithURL: [NSURL URLWithString:urlString] 
         cachePolicy: NSURLRequestReloadIgnoringLocalCacheData 
         timeoutInterval: 20 
         ]; 

NSURLConnection *connection = [[NSURLConnection alloc] 
           initWithRequest:request 
           delegate:self 
           startImmediately:YES]; 
if(!connection) { 
    NSLog(@"connection failed :("); 
} else { 
    NSLog(@"connection succeeded :)"); 

} 

} 


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
//NSLog(@"Received response: %@", response); 

[receivedData setLength:0]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
//NSLog(@"Received %d bytes of data", [data length]); 

[receivedData appendData:data]; 
//NSLog(@"Received data is now %d bytes", [receivedData length]); 

} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
NSLog(@"Error receiving response: %@", error); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
// Once this method is invoked, "responseData" contains the complete result 
//NSLog(@"Succeeded! Received %d bytes of data", [receivedData length]); 

NSString *dataStr=[[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]; 

NSLog(@"%@",dataStr); 

} 

вам это нужно в заголовке:

@interface NetConnection : NSObject 

{ 
NSMutableData *receivedData; 

} 

@property (nonatomic,retain) NSMutableData *receivedData; 
@property (nonatomic,retain) NSString *callback; 
+0

если я загрузить изображение, как, как вы сказали, привычка это может вызвать мой пользовательский интерфейс, чтобы блокировать на некоторое время? – RockandRoll

Смежные вопросы