2017-03-03 5 views
1

이미지 업로드에 시간이 걸리기 때문에 필자는 진행률 표시 줄이나 활동 표시기를 보여줘야합니다. 아래 코드는 내 코드이므로 진행률 막대가 표시되지 않는 이유를 알 수 없습니다. 나는 ProgressHUD를 사용했다.서버에 이미지를 업로드하는 동안 진행률 표시 줄을 표시 할 수 없습니다.

[ProgressHUD show:@"Please wait..."]; 
    NSDictionary *params [email protected]{ @"name":self->Name.text, @"contact_no":self->ContactNo.text,@"email_id":self->EmailId.text,@"s_date":Date,@"s_time":Time,@"streat":Street,@"city":City,@"state":State}; 

NSData *uploadData = Data; 
NSString *urlString = [NSString stringWithFormat:@"http://fsttest.com/iosservice/supremo/add_supremo"]; 


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

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

NSMutableData *body = [NSMutableData data]; 

for (NSString *name in params.allKeys) { 

    NSData *values = [[NSString stringWithFormat:@"%@", params[name]] dataUsingEncoding:NSUTF8StringEncoding]; 

    [body appendData:[[NSString stringWithFormat:@"--%@%@", boundary, kNewLine] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"", name] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"%@%@", kNewLine, kNewLine] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:values]; 
    [body appendData:[kNewLine dataUsingEncoding:NSUTF8StringEncoding]]; 
} 

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file_name\"; filename=\"test\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:uploadData]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:body]; 
[request setHTTPBody:body]; 


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

같은 방법은'sendSynchronousRequest'는 진행 표시 줄을 표시하지 SynchronousRequest'sendASynchronousRequest' –

+1

가서, 진행 표시 줄을 표시하지 않습니다. 그것은 같은 스레드에서 작동합니다. 다른 스레드를 만들거나 비동기 요청을 사용하십시오. –

+0

@ Anbu.Karthik은 나에게 같은 코드를 주실 수 있습니다. –

답변

1

선택 1

는 대리자를 추가하고

전자에 대한 sendAsynchronousRequestsendSynchronousRequest에서 요청을 수정이 선택

- (void)connection:(NSURLConnection *)connection 
    didSendBodyData:(NSInteger)bytesWritten 
totalBytesWritten:(NSInteger)totalBytesWritten 
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { 

    float progress = [[NSNumber numberWithInteger:totalBytesWritten] floatValue]; 
    float total = [[NSNumber numberWithInteger: totalBytesExpectedToWrite] floatValue]; 
    NSLog(@"progress/total %f",progress/total); 
} 

처럼 확인 g

당신이 진행 막대를 표시 할 경우
// NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
// NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

전화

// set URL 
[request setURL:[NSURL URLWithString:baseUrl]]; 

// add your progress bar here 
[ProgressHUD show:@"Please wait..."]; 

[NSURLConnection sendAsynchronousRequest:request 
           queue:[NSOperationQueue mainQueue] 
        completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

         NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 

         [ProgressHUD dismiss]; 

         if ([httpResponse statusCode] == 200) { 

          NSLog(@"success"); 
          if ([data length] > 0 && error == nil) 
           [delegate receivedData:data]; 
           // hide the progress bar here 
         } 

        }]; 
+0

하지만 각각에 진행 상황을 표시하려면 확실하지 않습니다 그리고 evry 순간'sendAsynchronousRequest to sendAsynchronousRequest'는 도움이되지 않습니다. 여기서'NSURL Connection with delegates'에 가야합니다. –

0

AFNetworking을 사용하면 쉽게 이미지를 업로드 할 수 있습니다. here AFNeworking 다운로드를 클릭하십시오. 코드 업로드 이미지와 동일합니다. 당신의 방법에 continution로

-(void)imageUpload 
{ 
    @try 
    { 
     [self progressViewDispaly]; 
     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
     [manager.requestSerializer setTimeoutInterval:600.0]; 
     [manager POST:YOUR_WEB_SERVICE_NAME parameters:YOUR_REQUEST_PARA constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) 
     { 
      for(NSString *strImageName in ImageArray) //if multiple images use image upload 
      { 
       NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
       NSString *documentsDirectory = [paths objectAtIndex:0]; 
       NSString *path = [documentsDirectory stringByAppendingPathComponent:strImageName]; 
       if (path != nil) 
       { 
        NSData *imageData = [NSData dataWithContentsOfFile:path]; 
        [formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"job_files[]"] fileName:[NSString stringWithFormat:@"%@",[[strImageName componentsSeparatedByString:@"/"] lastObject]] mimeType:@"image/jpeg"]; 
       } 
       else 
       { 
       } 
      } 

     } progress:^(NSProgress * _Nonnull uploadProgress) 
     {    
      [self performSelectorInBackground:@selector(makeAnimation:) withObject:[NSString stringWithFormat:@"%f",uploadProgress.fractionCompleted]]; 

     } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) 
     { 
      [SVProgressHUD dismiss]; 
      [_progressView removeFromSuperview]; 

     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 

     }]; 

    } @catch (NSException *exception) 
    { 
     NSLog(@"%@",exception.description); 
    } 
} 
-(void)makeAnimation:(NSString *)str 
{ 
    float uploadProgress = [str floatValue]; 
    [_progressView setProgress:uploadProgress]; 
} 
-(void)progressViewDispaly 
{ 
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; 

    _progressView = [[UIProgressView alloc] init];//WithProgressViewStyle:UIProgressViewStyleBar]; 
    _progressView.frame = CGRectMake(0, 0, CGRectGetWidth(statusBar.frame),20); 
    _progressView.backgroundColor = [UIColor blueColor]; 
    _progressView.progressTintColor = [UIColor whiteColor]; 
    [statusBar addSubview:_progressView]; 
}