2013-08-06 4 views
3

dispatch_async를 통해 storeViewController loadProductWithParameters를 호출 중입니다. 시간 제한 값을 설정하여 X 초 동안 결과를 가져온 다음 포기하려고 시도 할 수 있습니까?SKStoreProductViewController loadProductWithParameters에 대한 시간 제한을 설정할 수 있습니까?

+0

행운을 빌어 요? – Leonardo

+0

@ 레오나르도 - 알렉시스 프리볼라는 테스트를 원한다면 가능한 해결책을 가지고 있습니다. – runamok

답변

1

loadProductWithParameters를 직접 호출하는 대신 아래의 클래스 메서드를 사용하여 자체 타임 아웃을 구현했습니다. dispatch_after__block 변수 덕분에 시간이 초과되었습니다. loadProductWithParameters가 completionBlock라고하지 않고 ... 희망이 도움이 아이튠즈에 노래를 구매에서 내 사용자를 중지 않기 때문에

+ (void)loadProductViewControllerWithTimeout:(NSTimeInterval)timeout 
         storeKitViewController:(SKStoreProductViewController *)storeKitViewController 
            parameters:(NSDictionary *)parameters 
          completionHandler:(void (^)(BOOL result, NSError *error))completionHandler { 

    __block BOOL hasReturnedOrTimedOut = NO; 

    [storeKitViewController loadProductWithParameters:parameters completionBlock:^(BOOL result, NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (!hasReturnedOrTimedOut) { 
     hasReturnedOrTimedOut = YES; 
     if (completionHandler) completionHandler(result, error); 
     } 
    }); 
    }]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    if (!hasReturnedOrTimedOut) { 
     hasReturnedOrTimedOut = YES; 
     if (completionHandler) completionHandler(NO, nil); // Or add your own error instead of |nil|. 
    } 
    }); 
} 

내 최신 응용 프로그램 업데이트는 애플에 의해 거부되었다. 내가 지금처럼 acomplished 한

+0

답변 해 주셔서 감사합니다. 나는 iOS 개발자를 많이하지 않고 있지만 테스트 해 볼 기회가 있다면 그렇게 할 것입니다. – runamok

0

: dismissAndShowError 방법은 dismissViewControllerAnimated를 실행하고 오류와 경고 표시

__block BOOL timeoutOrFinish = NO; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    if(!timeoutOrFinish) { 
     timeoutOrFinish = YES; 
     [self dismissAndShowError]; 
    } 
    }); 

    [storeViewController loadProductWithParameters:parameters completionBlock:^(BOOL result, NSError * _Nullable error) { 
    if(timeoutOrFinish) { 
     return; 
    } 

    timeoutOrFinish = YES; 
    //[[NetworkManager sharedManager] showNetworkActivityIndicator:NO]; 
    if(error) { 
     [self dismissAndShowError]; 
    } 
    }]; 

    [self.view.window.rootViewController presentViewController:storeViewController animated:YES completion:nil]; 

.

기본적으로 플래그를 전환하는 별도의 타이머 (내 경우에는 30 초)가 있습니다. 그 시간이 지나도 저장소가 아직로드되지 않은 경우 저장소를 닫고 오류가 표시됩니다. 그렇지 않으면 완료 (취소, 완료 및 오류)가 호출되며 상태에 따라 모든 작업을 처리합니다.

관련 문제