2012-07-12 5 views
2

내 iOS 앱에서 AFURLConnectionOperation 클래스 (보기 A)를 사용하여 이미지를 업로드하고 사용자가 이미지 (보기 B)의 일부를 편집 할 수 있도록 허용합니다. 나중에 View C에서 View A에서 시작한 업로드 진행 상황을 보여주는 진행률 표시 줄이 있습니다.백그라운드에서 실행되는 AFNetworking AFURLConnectionOperation의 진행 상태를 어떻게 알 수 있습니까?

View A에서 시작한 작업 진행 방법에 액세스하는 방법을 알 수 없습니다. C 네트워크 내에서 AFNetworking을 사용합니다. 내가 아는 한 그것은 가능하지 않을 수도 있습니다. 사전에

감사합니다,

답변

3
물론

가능 윌하고 AFNetworking 함께 할 거의 가지고 있지만 훨씬 더 일반적인 프로그래밍 패턴으로 할 수 있습니다.

AFURLConnectionOperation 개체는보기 컨트롤러 외부에 저장해야합니다.이 개체는 둘 다 액세스 할 수 있습니다. 가장 좋은 방법은 이미지 업로드를 처리 할 AFNetworking 속성과 메서드를 캡슐화하는 singleton class을 만드는 것입니다. 해당 업로드에 대한 정보가 있거나 해당 업로드와 상호 작용이 필요하면 언제든지 sharedInstance과 같은 클래스 메소드를 통해 해당 싱글 톤에 액세스 할 수 있습니다.

+ (id)sharedInstance 
{ 
    static dispatch_once_t once; 
    static id sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

당신은 웹 서비스 (그리고 원시 FTP 서버)와 상호 작용하는 경우, 다음 AFHTTPClient의 서브 클래스 아마 급 솔루션의 '업로드 관리자'유형에 대한 가장 좋은 것입니다. 간단한 클래스를 사용하면 다음 깨끗하게하여 UI 업데이트 (예를 들어, 진행률 표시 줄)을 처리 할 수 ​​viewWillDisappear에 ViewControllers 'viewWillAppear & 등록 취소에 KVO 알림을 등록 할 수 있습니다 함께 넣어 일단

은 당신이 선택하든. 키 - 값 관측을 이해하지 못하면 Introduction to Key-Value Observing Programming Guide을 읽으십시오. 당신은 당신의 벨트 밑에 그 지식을 가지고 아이폰 OS에서 대처할 수있을 것입니다.

그래서,보기 A의 업로드 코드를 작성하고 URL을 사용하여 업로드 대기열에 자신의 마법 새로운 클래스를 사용

(다음과 같이 여러 방법으로 메모리, NSFileURLs 또는있는 NSString 이미지를 사용하도록 할 수있다)

[[MyImageUploadManager sharedInstance] uploadImageFromPath:@"/wherever/1.png" toURL:[NSURL URLWithString:@"ftp://someserver.com/images/"]]; 
보기 C의 viewWillDisappear보기 C의 컨트롤러의 viewWillAppear

- (void) viewWillAppear:(BOOL)animated 
{ 
    ... 
    [[MyImageUploadManager sharedInstance] addObserver:self forKeyPath:@"progress" options:NSKeyValueObservingOptionNew context:nil]; 
    ... 
} 

...과의

- (void)viewWillDisappear:(BOOL)animated 
{ 
    ... 
    [[MyImageUploadManager sharedInstance] removeObserver:self forKeyPath:@"progress" context:nil]; 
    ... 
} 

업로드 관리자 클래스에서 '진행'속성이 변경 될 때마다 iOS는 observerValueForKeyPath:ofObject:change:context: 함수를 호출합니다. 다음은 매우 단순한 버전입니다.

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"progress"]) 
    { 
     // since you only upload a single file, and you've only added yourself as 
     // an observer to your upload, there's no mystery as to who has sent you progress 

     float progress=[change valueForKey:NSKeyValueChangeNewKey]; 
     NSLog(@"operation:%@ progress:%0.2f", object, progress); 

     // now you'd update the progress control via a property bound in the nib viewer 
     [[_view progressIndicator] setProgress:progress]; 
    } 
    else 
    { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

그게 도움이 되었으면 좋겠어요.

관련 문제