2010-06-14 41 views
0

目前我正在從plist加載支持的產品,然後發送SKProductsRequest以確保我的SK產品仍然可用有效。在iphone上的應用程序購買:如何在有人可以購買前獲得可用產品*

所以我設置的要求,啓動它,並得到響應:

  • (無效)productsRequest:(SKProductsRequest *)要求didReceiveResponse:(SKProductsResponse *)響應

現在,到目前爲止所有功能正常。 問題:從調用請求直到收到響應,它可能會持續幾秒鐘。直到我的應用程序已經加載並且用戶可能能夠選擇併購買產品。

但由於沒有收到產品,可用產品與驗證產品不同步 - >不太可能,但可能出現錯誤。

所以我的想法是等待數據加載,只有當列表被驗證時才繼續。 (等待幾秒鐘...)。我有一個管理所有產品的單例實例。

+ (MyClass *) sharedInstance 
{ 
    if (!sharedInstance) 
     sharedInstance = [MyClass new]; 
// Now wait until we have our data 
    [condition lock]; 
    while (noEntriesYet) // is yes at begin 
     [condition wait]; 
    [condition unlock]; 
    return sharedInstance; 
} 

- productsRequest: didReceiveResponse: 
{ 
[condition lock]; 

// I have my data 

noEntriesYet = false; 
[condition signal]; 
[condition unlock]; 
} 

問題:應用程序凍結。如果didReceiveResponse在 之前完成查詢sharedInstance,一切正常工作。有不同的線程,如果 在didReceiveResponse期間達到等待,則鎖定工作,一切正常。但是,如果不是,即使請求已發送,也不會調用didReceiveResponse 。 鎖被釋放,一切看起來都不錯。我試圖在單獨的NSThread中使用NSOperationQueue發送產品請求,但沒有成功。

  • 爲什麼?發生什麼事 ?
  • 如何解決問題?

回答

0

好吧,我有這個問題至今:

的通知顯示在主運行循環總是傳送,所以運行的循環可能不會停止。 由於在主運行循環中初始化的共享實例,所以沒有辦法規避 它。

我終於做了什麼:我向共享實例添加了一個標誌,指示產品列表 是否已到達。在您嘗試購買產品之前,您必須詢問是否已加載產品, 否則會彈出一個UIAlertView並通知您產品列表尚未得到驗證,您應該在短時間後重試該產品列表。

工作;爲了保證您只獲得有效的產品,產品信息只能從共享實例中獲取。

0

我想你會在產品加載時阻止你的GUI。在這種情況下,用戶不能改變任何東西。例如:我使用透明視圖+ uiactivityindicator在應用商店工作期間阻止應用。

+0

由於GUI在主運行循環中工作,凍結的原因現在已知。不幸的是,我需要didReceiveResponse,並且消息在主線程上運行*,因此使用另一個線程初始化共享實例並阻止GUI直到我收到更復雜。在我的解決方案後,我沒有試圖解決這個問題 – 2010-06-17 13:55:00

相關問題