2011-11-08 50 views
0

我需要一些幫助,我一直在四處尋找,找不到正確的答案即時尋找。從同步請求切換到具有圖片上傳的異步請求?

我上傳圖片和視頻到我的服務器通過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"); 
} 

回答

2

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: 

估算上傳進度

您可以估算一個HTTP POST上傳與 連接的進度:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite: 委託方法。請注意,由於連接可能會失敗,或者連接可能會遇到身份驗證質詢,因此這不是上載 進度的確切度量。

+0

我已經編寫了'returnData'和'returnString',並已執行的文檔使用什麼樣的蘋果, 'NSURLConnection的*連接= [[NSURLConnection的頁頭] initWithRequest:theRequest委託:自我]' 我也實現了一些方法,並且它們都沒有運行,並且文件沒有被上傳。還有什麼我需要改變? 感謝您的答覆 我有那麼還增加了代表對我的.h文件中 'NSURLConnectionDataDelegate' – Jacob

+0

這很難說。這裏是另一個關於帖子的SO問題,什麼都沒發生。檢查出來:http://stackoverflow.com/questions/7748553/posting-to-yfrog-objc/7748607#7748607 – bryanmac

+0

我已經添加了方法,並做出了你在其他問題中回答的變化,仍然沒有運氣。如果你可以請檢查更新,看看一切是否正常? – Jacob