【问题标题】:Switch from Synchronous request to Asynchronous request with image upload?通过图像上传从同步请求切换到异步请求?
【发布时间】:2011-11-08 11:41:10
【问题描述】:

我需要一些帮助,我一直在四处寻找,但找不到我正在寻找的正确答案。

我正在通过 php 将图像和视频上传到我的服务器,当我上传视频或图像时,我希望能够显示进度视图,有人告诉我这样做的唯一方法是使用异步的同步。我一直在寻找设置它的方法,但似乎真的找不到一个很好的教程来帮助我完成我想要完成的事情。

这是一些代码:

- (void)post:(NSData *)fileData
{


NSMutableArray *array = [[NSMutableArray alloc]initWithContentsOfFile:[self saveUserLogin]];

int test;
NSString *string = [array objectAtIndex:3];
test = [string intValue];
test++;
NSData *videoData = fileData;
NSString *urlString = [[NSString alloc]initWithFormat:@"http://www.site.com/members/uploadMovie.php?&username=%@", [array objectAtIndex:0]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];

NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSString *postName = [[NSString alloc]initWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"vid%i.mov\"\r\n", test];
[body appendData:[[NSString stringWithString:postName] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:videoData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];


NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

NSLog(@"%@", returnString);

NSArray *values = [[NSArray alloc] initWithObjects: [array objectAtIndex:0],[array objectAtIndex:1], [array objectAtIndex:2], [NSString stringWithFormat:@"%i", test], nil];
[values writeToFile:[self saveUserLogin] atomically:YES];
[self.delegate didFinishController:self];
}

这是我用来发送视频的一些代码。 filedata 是与视频数据一起传入的参数。我想为上传进度制作一个 UIProgressview 动画。我还听说苹果无论如何都喜欢人们使用异步。如果有人可以帮助我设置异步而不是我所拥有的,我将不胜感激。如果您回复,请具体说明,例如我需要导入哪些代表、方法。等等

非常感谢:)

编辑:

这就是现在的样子:

- (void)post:(NSData *)fileData
{


NSMutableArray *array = [[NSMutableArray alloc]initWithContentsOfFile:[self saveUserLogin]];

int test;
NSString *string = [array objectAtIndex:3];
test = [string intValue];
test++;
NSData *videoData = fileData;
NSString *urlString = [[NSString alloc]initWithFormat:@"http://www.site.com/members/uploadMovie.php?&username=%@", [array objectAtIndex:0]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];

NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];

NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSString *postName = [[NSString alloc]initWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"vid%i.mov\"\r\n", test];
[body appendData:[[NSString stringWithString:postName] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:videoData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];


//NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
if (connection) {
    NSLog(@"connected");
    responceData = [NSMutableData data];

}
else{
    NSLog(@"error");
}
//  NSLog(@"%@", returnString);

NSArray *values = [[NSArray alloc] initWithObjects: [array objectAtIndex:0],[array objectAtIndex:1], [array objectAtIndex:2], [NSString stringWithFormat:@"%i", test], nil];
[values writeToFile:[self saveUserLogin] atomically:YES];
   // [self.delegate didFinishController:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responceData appendData:data];
}

- (void) connectionDidFinishLoading:(NSURLConnection *)connection {

NSString* responseString = [[NSString alloc] initWithData:responceData     encoding:NSUTF8StringEncoding];
NSLog(@"result: %@", responseString);

}

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"error - read error object for details");
}

【问题讨论】:

    标签: iphone objective-c ios asynchronous


    【解决方案1】:

    NSUrlConnection 有一个带有回调的异步请求。

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest   
    

    NSUrlConnection 概览:

    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

    该文档还指出,您可以通过实现回调来估计上传进度。

    connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
    

    估计上传进度

    您可以使用 连接:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite: 委托方法。请注意,这不是上传的精确测量值 进度,因为连接可能失败或连接可能 遇到身份验证挑战。

    【讨论】:

    • 我已经编码了returnDatareturnString,并且已经实现了苹果在文档中使用的东西,NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];我也实现了一些方法,但它们都没有运行并且文件未上传。我还有什么需要改变的吗?感谢您的回复,然后我还将委托添加到我的 .h 文件 NSURLConnectionDataDelegate
    • 很难说。这是帖子上的另一个 SO 问题,没有发生任何事情。看看:stackoverflow.com/questions/7748553/posting-to-yfrog-objc/…
    • 我已经添加了方法,并进行了您在另一个问题中回答的更改,但仍然没有运气。如果可以,请检查更新,看看一切是否正常?
    • 我已经添加了方法,并进行了您在另一个问题中回答的更改,但仍然没有运气。如果可以,请检查更新,看看一切是否正常?谢谢:D
    • nvm 刚刚得到它。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2023-04-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多