在后台线程中上传大图像. [英] Uploading Big Image In Background Thread.

查看:68
本文介绍了在后台线程中上传大图像.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将图像上传到Web服务.以下是我返回上传图片的代码段.图像大小非常大(大约6Mb).我正在使用GCD在后台线程中上传该图像.

I need to upload an Image To webservice. Below is the code snippet i have return to upload an image. The image size is very big (around 6Mb). I am Uploading that Image in Background Thread using 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;  

}

现在我面临的问题是,如果我尝试在后台线程中上传图像,请求将不会发送到服务器(我正在检查服务器上的日志文件).但是如果我在主线程中上传图像,请求将发送到服务器(仅出于测试目的,我知道在主线程中上传大图像不是一个好主意).那么,我在这里做错了什么?后台线程有什么问题吗?请帮我.预先感谢.

now the problem i am facing is, if i try to upload the image in background Thread the request is not going to server ( I am checking the Log file on server). but if i upload Image in Main Thread the request is going to server (Just for testing purpose, I know that its not good idea to upload big images in main thread). So what am i doing wrong here ? is there any problem with Background Threading ? Plz Help me Out. Thanks in advance.

推荐答案

而不是在后台线程上执行.您可以创建一个进行此类网络连接的类.

Instead of doing it on a background thread. you could create a class that does your net connections like this.

您只需要在字段中添加即可发布图片.

you'll just need to add in the fields to post your image.

- (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;

这篇关于在后台线程中上传大图像.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆