UIIMagePickerController & NSURLConnection - PullRequest
1 голос
/ 23 июля 2011

UIImagePickerController зависает, пока я думаю, что Изображение сжимается или отправляется NSURLConnection, хотя я не уверен, что это позже.

Я хочу, чтобы все это было сделано в фоновом режиме. Вместо этого, когда я выбираю фотографию из библиотеки, экран зависает навсегда. Это не оптимально, очевидно. Какой подход я должен использовать здесь?

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo
{
int i = 0;
NSString *uniquePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/selectedImage.png"];

while ([[NSFileManager defaultManager] fileExistsAtPath:uniquePath])
{
    uniquePath = [NSString stringWithFormat:@"%@/%@-%d.%@", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"], @"selectedImage", ++i, @"png"];
}

NSLog(@"Writing selected Image to Documents Folder, %@", uniquePath);

dataForPNGFile = UIImagePNGRepresentation(img);

if (!dataForPNGFile) return NO;

[UIImagePNGRepresentation(img) writeToFile:uniquePath atomically:YES];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
[[self parentViewController] dismissModalViewControllerAnimated:YES];
[picker release];

NSString *urlString = @"http://localhost:3000/photos";
NSURL *url = [NSURL URLWithString:urlString];
NSString *boundary = @"----1010101010";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSString *photoPath = [[NSBundle mainBundle] pathForResource:@" my-photo " ofType:@"jpg"];
NSData *photoData = [NSData dataWithContentsOfFile:photoPath];

NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"photo-description\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"testing 123" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//  [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photo-file\"; filename=\"%@\"\r\n", " my-photo.jpg"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:photoData];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"tags\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"random,test,example" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
[request addValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField: @"Content-Length"];

[[NSURLConnection alloc] initWithRequest:request delegate:self];

}

1 Ответ

0 голосов
/ 23 июля 2011

Вы должны использовать:

detachNewThreadSelector: toTarget: withObject:

Отсоединяет новый поток и использует указанный селектор в качестве точки входа в поток.

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

Документацияздесь: NSThread

Это создаст новый поток для операции, которая потребляет процессор, поэтому ваш пользовательский интерфейс не затронут, не забудьте создать NSAutoreleasePool для нового потока, как толькоосновной поток получает пул NSAutoreleasePool по умолчанию.

Итак, в начале вашего селектора выполните:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//and at the end:

[pool drain]:
...