NSURLConnection和NSURLConnectionDelegate在标题中描述的不同线程

问题描述:

上工作,我做了一些像这样的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

你有没有添加这行[连接startConnection]; – sample

其实,当你当这个函数会执行完全按照自己的操作就完了,还因为NSURLConnection的调用它在同一线程,在它开始委托,意思是“transferToServerAddimages”操作设置选择,使它可能是线程(OperationQueue)在响应到达之前完成的。如果你确实想使用NSOperationQueue,那么使用一个更好的函数是NSUrlConnection的“sendAsynchronousRequest:queue:completionHandler:”。

代表是什么,NSOperation?一种可能性是您的操作正在呼叫-[connectionWithRequest:delegate:]并退出,导致它完成并被删除。在操作的dealloc中放入一个NSLog以查看它是否正在运行。

假设所有操作都是NSURLConnection转换,您不需要将事务包装在NSOperation中以获得并发性,因为这些转换已经是异步的。但如果你真的想使用NSOperation(出于协调等目的),使其成为“并发”,并将其放在主队列中。这些比较棘手,但有一些例子。