0

目前我正在从 plist 加载我支持的产品,然后我发送一个 SKProductsRequest 以保证我的 SKProducts 仍然有效。

所以我设置了请求,启动它并获得响应:

  • (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

现在,到目前为止,所有功能都正常。问题:从调用请求到收到响应可能会持续几秒钟。在此之前我的应用程序已经加载并且用户可以选择和购买产品。

但是由于没有收到任何产品,可用产品与已验证产品不同步 -> 不太可能,但可能出现错误。

所以我的想法是等到数据加载完毕,只有在验证列表后才继续。(只需等待几秒钟......)。我有一个管理所有产品的单例实例。

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

问题:应用程序冻结。如果在查询 sharedInstance 之前完成了 didReceiveResponse ,则一切正常。有不同的线程,如果在didReceiveResponse期间达到等待,锁正在工作,一切都很好。但如果没有,即使发送了请求,也永远不会调用 didReceiveResponse。锁被释放,一切看起来都很好。我试图在单独的 NSThread 中发送产品请求,使用 NSOperationQueue...无济于事。

  • 为什么 ?怎么了 ?
  • 如何解决问题?
4

2 回答 2

0

好的,到目前为止我的问题是:

通知总是在主运行循环中发送,因此运行循环可能不会停止。由于共享实例在主运行循环中初始化的,因此无法绕过它。

我最终做了什么:我在我的共享实例中添加了一个标志,表明产品列表是否已经到达。在您尝试购买产品之前,您必须询问它是否已加载,否则会弹出 UIAlertView 并通知您产品列表尚未验证,您应该稍后再试一次。

这样可行; 为保证您只获得有效产品,产品信息只能从共享实例中获取。

于 2010-06-17T13:30:55.080 回答
0

我认为您会在产品加载期间阻止您的 GUI。在这种情况下,用户无法更改任何内容。例如:我使用透明视图 + uiactivityindicator 在使用应用商店期间阻止应用。

于 2010-06-14T18:11:10.303 回答