0

У меня есть вопрос о NSURLConnection: Я хочу загрузить изображение с:данные NSURLConnection полученные после connectionDidFinishLoading

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

первый делегат называется (правильно) является

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

после того, как это называется один время:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

и сразу:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

до здесь все правильно, но после того, как connectionDidFinishLoading обжигают еще раз делегат didReceiveData для той же связи, я отождествляю соединение по:

NSString * connectionKey = [[[connection originalRequest] URL] absoluteString]; 

Возможно ли это?

обновление, более подробная информация:

Моего приложение огнь много одновременных соединений и хранить Infos для любого соединения в словаре, когда делегат был вызван я retrive информации о соединении с помощью ключа: NSString * connectionKey = [[[ connection originalRequest] URL] absoluteString]; 99% подключений все в порядке, но в течение одного (Эйвери время то же самое!) соединение у меня такое поведение


здесь полную реализацию:

- (void)downloadFileFromUrl:(NSURL *)url 
        inPath:(NSString *)completeFilePath 
      dataReceivedBlock:(void (^)(long long byteDownloaded ,long long totalByte))dataReceivedBlock 
        endBlock:(void (^)(NSString * downloadPath, NSDictionary * responseHeaders))endBlock 
        failBlock:(void (^)(NSString * downloadPath, NSDictionary * responseHeaders, NSError * error))failBlock 
{ 
    //save the connection infos  
NSMutableDictionary * requestData = [[NSMutableDictionary alloc] init]; 
if(dataReceivedBlock) 
[requestData setObject:[dataReceivedBlock copy] forKey:@"dataReceivedBlock"]; 
if(endBlock) 
[requestData setObject:[endBlock copy] forKey:@"endBlock"]; 
if(failBlock) 
[requestData setObject:[failBlock copy] forKey:@"failBlock"]; 

     [requestData setObject:[NSNumber numberWithBool:YES] forKey:@"usingBlock"]; 
     [requestData setObject: completeFilePath forKey:@"downloadDestinationPath"]; 

    //delete the file if already on fs 
    if([[NSFileManager defaultManager] fileExistsAtPath: completeFilePath]) 
     [[NSFileManager defaultManager] removeItemAtPath:completeFilePath error:nil]; 

    // Create the request. 
    NSURLRequest * urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageAllowed timeoutInterval:TIME_OUT]; 
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
    if (!theConnection) 
    { 
     // Inform the user that the connection failed. 
     failBlock(completeFilePath,nil,[NSError errorWithDomain:@"Connection fail" code:0 userInfo:nil]); 
    } 

    //add connection infos to the requests dictionary 
    NSString * connectionKey = [[[theConnection originalRequest] URL] absoluteString]; 
    [self.requests setObject:requestData forKey:connectionKey]; 
} 

здесь пример делегата:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

{ 

NSString * connectionKey = [[[connection originalRequest] URL] absoluteString]; 
NSMutableDictionary * requestData = [self.requests objectForKey:connectionKey]; 
NSFileHandle *file = [requestData objectForKey:@"fileHandle"]; 
[file closeFile]; 

//se la richiesta usa o no block 
BOOL usingBlock = [[requestData objectForKey:@"usingBlock"] boolValue]; 
if(usingBlock) 
{ 
    __block void (^endBlock)(NSString * , NSDictionary *) = [requestData objectForKey:@"endBlock"]; 
    if(endBlock) 
     endBlock([requestData objectForKey:@"downloadDestinationPath"],[requestData objectForKey:@"responseHeaders"]); 
} 
else 
    [self.delegate downloadEnded:[requestData objectForKey:@"responseHeaders"]]; 


//elimino dati richiesta 
[self.requests removeObjectForKey:[NSString stringWithFormat:@"%@",connectionKey]]; 

//Inibisco standby 
[UIApplication sharedApplication].idleTimerDisabled = NO; 
} 
+0

Что это значит ??? Вы говорите, что метод didReceiveData называется даже после вашего соединенияDidFinishLoading: method ?? –

+0

ДА! Мое приложение запускает много одновременных подключений, и я храню информацию для любого соединения в словаре, когда был вызван делегат. Я извлекаю информацию о соединении с помощью ключа: NSString * connectionKey = [[[connectionRequest] URL] absoluteString]; для 99% соединений все в порядке, но для одного (каждый раз такое же!) соединение У меня такое поведение – Kappe

+0

Покажите свой код, как вы создаете связи и иналиализируете его. И одно должно быть ясно. Не звоните, как вы сказали, в любой ситуации .. Это было бы проблемой в другом месте. Вы можете называть это вручную в любых местах. Опубликовать весь код для методов NSUrlConnection Delegate и инициализации –

ответ

0

Очевидно, что решение действительно просто -_- Ошибка в ключевой идентификатор соединения:

NSString * connectionKey = [[[connection originalRequest] URL] absoluteString]; 

мое предположение, что ключ уникальны, но если я х докачка для одного файла в тот же url предположение неправильно;)

0

Это невозможно. Это должен быть другой обратный вызов соединения.

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

+0

вопрос обновлен – Kappe

+0

это может быть ошибка сервера? – Kappe

+0

@Kappe вы можете протестировать URL-адрес единственного проблемного соединения. В принципе, соединение закрывается, когда вы получаете метод делегирования didfinishloading –

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