我目前通過dispatch_async調用storeViewController的loadProductWithParameters。是否可以設置一個超時值,以便它只嘗試獲取X秒的結果,然後放棄?是否有可能爲SKStoreProductViewController loadProductWithParameters創建超時?
3
A
回答
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秒),切換一個標誌。此後,如果商店尚未加載,則關閉它並顯示錯誤。否則,調用完成(取消,完成和錯誤)並根據狀態處理所有操作。
相關問題
- 1. SKStoreProductViewController loadProductWithParameters是否可以在後臺運行?
- 2. 是否有可能增加CloudFlare超時?
- 3. 是否有可能重新創建JVM?
- 4. 爲什麼SKStoreProductViewController loadProductWithParameters不會在iOS 8.0.2上爲Apple App Testers調用它的completionBlock?
- 5. 是否有可能有效地創建時間樹圖結構?
- 6. 是否有可能爲Toastr單獨設置超時?
- 7. 是否有可能創建一個在Objective-C中有兩個超類的類?
- 8. 是否有可能創建/創建我丟失的密鑰庫?
- 9. 是否有可能檢索Facebook Page的創建時間/日期?
- 10. Salesforce:在對象上創建計時器 - 是否有可能?
- 11. 是否有可能在setup.exe運行時創建環境變量
- 12. 是否有可能在ArangoDB中同時創建邊和頂點
- 13. SharePoint - eChat - 是否有可能在SharePoint中創建實時問答
- 14. 是否有可能在sqlite中創建臨時索引?
- 15. 是否有可能爲Arrays c#創建構造函數?
- 16. 是否有可能爲DateTime對象創建C#'指針'?
- 17. 是否有可能爲Direct TCP傳輸創建BrowserSession?
- 18. 是否有可能爲F#元組創建擴展方法
- 19. 是否有可能爲NVD3創建區域的焦點圖表?
- 20. 是否有可能爲Core Data創建自定義SQLite版本?
- 21. 是否有可能爲string,int,bool創建eventlisteners?
- 22. 是否有可能在Linux上使用Genymotion爲Android創建bot?
- 23. 是否有可能爲android相機創建自定義效果?
- 24. 是否有可能爲clang格式創建自定義規則?
- 25. 是否有可能在Python中爲SPSS創建數據對象
- 26. 是否有可能爲win32控制檯和MFC GUI創建DLL
- 27. 是否有可能在C#中爲泛型創建「此類型」?
- 28. 是否有可能爲iOS創建自定義崩潰動畫?
- 29. 是否有可能在Ruby中爲模塊創建別名?
- 30. SSRS 2008 R2 - 是否有可能爲表視圖創建參數
任何運氣得到解決方案? – Leonardo
@Leonardo - 我沒有,但如果你想測試它,Alexis Pribula有一個可能的解決方案。 – runamok