2012-07-03 3 views
0

как описано в названии, я сделал некоторое NSURLConnection, как это. Но я обнаружил, что метод делегата не может быть запущен. Кто-нибудь знает, как с этим бороться?NSURLConnection и NSURLConnectionDelegate работают над разными потоками

Редактировать: Мой делегат работает над основным потоком, а NSURLConnection работает в очереди операций. Теперь дело в следующем: NSURLConnection работает нормально, но делегат не будет работать.

редактировать 2: Я использовал метод класса [NSURLConnection connectionWithRequest: делегат:]

здесь находится на моей основной очереди

NSOperationQueue *queuePhoto = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *invocationOperationPhotos = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(transferToServerAddimages:) object:arrayOfASection]; 
//      [invocationOperationPhotos addObserver:self forKeyPath:@"isExecuting" options:0 context:invocationOperationPhotos]; 
//      [invocationOperationPhotos addObserver:self forKeyPath:@"isCancelled" options:0 context:invocationOperationPhotos]; 
//      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(<#selector#>) name:@"isExecuting" object:nil]; 
         [invocationOperationPhotos setQueuePriority:NSOperationQueuePriorityHigh]; 
        [queuePhoto addOperation:invocationOperationPhotos]; 
        [mutableArrayPhotoQueue addObject:queuePhoto]; 
        [invocationOperationPhotos release]; 
        [queuePhoto release]; 

вот мой NSURLConnnection:

- (void) transferToServerAddimages:(NSArray *) arrayToAdd 
{ 
NSLog(@"[NSOperationQueue currentQueue]: %@", [NSOperationQueue currentQueue]); 

NSString *murphoAppPrefix = [[AppDelegate sharedAppDelegate] murphoAppPrefix]; 
// setting up the request object now 
NSString *urlString = [murphoAppPrefix stringByAppendingString:@"addPhotos.php"]; 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

/* 
add some header info now 
we always need a boundary when we post a file 
also we need to set the content type 
*/ 
// set header value , some random text that will never occur in the body 
NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

/* 
now lets create the body of the post 
*/ 
NSMutableData *body = [NSMutableData data]; 

// email part  
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"email\"\r\n\r\n%@", self.trip.whoCreate.email] dataUsingEncoding:NSUTF8StringEncoding]]; 

// password part 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"password\"\r\n\r\n%@", self.trip.whoCreate.psw] dataUsingEncoding:NSUTF8StringEncoding]]; 

// image part 
NSInteger subCount=0; 
for (NSDictionary *aDict in arrayToAdd) { 
    // belonging part 

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"r_whichShortTrip%d\"\r\n\r\n%@", subCount, [aDict objectForKey:@"r_whichShortTrip"]] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uniqueId%d\"\r\n\r\n%@", subCount, [aDict objectForKey:@"uniqueId"]] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"createdTime%d\"\r\n\r\n%@", subCount, [aDict objectForKey:@"createdTime"]] dataUsingEncoding:NSUTF8StringEncoding]]; 

    UIImage *imageFile = [aDict objectForKey:@"image"]; 
    NSData *imageData = UIImageJPEGRepresentation(imageFile, 1.0); 
    NSString *imageName = [[URLConnect createUUID] stringByAppendingString:@".jpg"]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
    [body appendData:[[NSString stringWithFormat: 
         @"Content-Disposition: form-data; name=\"image%d\"; filename=%@\r\n", subCount, imageName]       dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[NSData dataWithData:imageData]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

    UIImage *thumbnail = [aDict objectForKey:@"thumbnail"]; 
    NSData *thumbnailData = [NSData dataWithData:UIImageJPEGRepresentation(thumbnail, 1)]; 
    NSString *thumbnailName = [[URLConnect createUUID] stringByAppendingString:@".jpg"]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
    [body appendData:[[NSString stringWithFormat: 
         @"Content-Disposition: form-data; name=\"thumbnail%d\"; filename=%@\r\n", subCount++, thumbnailName]       dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[NSData dataWithData:thumbnailData]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
} 


[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
// setting the body of the post to the reqeust 
[request setHTTPBody:body]; 

// now lets make the connection to the web 
[NSURLConnection connectionWithRequest:request delegate:self]; 

}

вот мой делегат:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    [[[AppDelegate sharedAppDelegate] mArrayOfFailedConnection] addObject:connection]; 
    [connection cancel]; 
    connection = nil; 
} 


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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"connection: %@", connection); 
} 
+5

Пожалуйста, введите код –

+2

Если в вашем потоке нет цикла запуска, NSURLConnection не будет работать. –

+0

У вас добавлена ​​эта линия [connection startConnection]; – sample

ответ

0

На самом деле, когда вы установите переключатель для работы в качестве «transferToServerAddimages», что означает, когда эта функция будет выполнена полностью ваша операция будет закончена, и так NSURLConnection называет своих делегатов на том же потоке, на котором она была запущена, так вероятно, что поток (OperationQueue) был закончен до того, как ответ пришел. Если вы действительно хотите использовать NSOperationQueue, то лучше использовать функцию «sendAsynchronousRequest: queue: completionHandler:» из NSUrlConnection.

0

Что такое делегат, NSOperation? Одна из возможностей заключается в том, что ваша операция вызывает -[connectionWithRequest:delegate:] и выход, что приводит к ее завершению и удалению. Поместите NSLog в dealloc операции, чтобы проверить, не работает ли его.

Предполагая, что все операции выполнены NSURLConnection, вам не нужно обертывать транзакцию в NSOperation, чтобы получить параллелизм, поскольку эти транзакции уже асинхронны. Но если вы действительно хотите использовать NSOperation (для целей координации и т. Д.), Сделайте его «параллельным» и поместите его в основную очередь. Эти виды сложнее, но есть примеры.

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