2013-08-06 19 views

回答

1

我通過使用下面的類方法實現了我自己的超時,而不是直接調用loadProductWithParameters。它由於變量dispatch_after__block變量而超時。

+ (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|. 
    } 
    }); 
} 

我最新的應用程序更新得到了由蘋果拒絕,因爲loadProductWithParameters從來沒有所謂的completionBlock和停止我的用戶購買iTunes上的歌曲......希望這有助於。

+0

感謝您的回覆。我沒有做太多的iOS開發,但如果我有機會測試它,我會的。 – runamok

0

我已經acomplished它像這樣:

__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]; 

其中dismissAndShowError方法運行dismissViewControllerAnimated,並顯示一個錯誤警報。

基本上,你有一個單獨的計時器(在我的情況下是30秒),切換一個標誌。此後,如果商店尚未加載,則關閉它並顯示錯誤。否則,調用完成(取消,完成和錯誤)並根據狀態處理所有操作。

相關問題