每当我打电话给一个街区时,我的NSArray很清楚。有没有解决方案如何从块中获取数据?
- (void)reload {
products = nil;
products= [[NSArray alloc] init];
[[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *storeProducts) {
if (success) {
products = storeProducts;//i need products (NSArray)
}
}];}
然后它正在调用SKProductRequest。而且我知道这是一个回调。谢谢你的帮助:))
答案 0 :(得分:1)
因为您正在修改块中的products
var,所以需要将其声明为__block
,以便变量将存在于共享存储中。如果不将其声明为__block
,则var值将传递给块,并且无法修改。根据文件:
使用__block变量共享存储空间
如果您需要能够更改捕获变量的值 在一个块中,您可以使用__block存储类型修饰符 原始变量声明。这意味着变量存在于中 在原始词法范围之间共享的存储 变量和在该范围内声明的任何块。
答案 1 :(得分:0)
您的代码看起来没问题,因为当{em>请求完成并调用完成处理程序时,products
(我假设为实例变量)将被分配。
(简而言之,如果要重新分配products= [[NSArray alloc] init];
,则无需执行products
。
我认为你的问题是products
在调用这个方法后仍然是空的,那是因为调用是异步(即运行在一个单独的执行线程中)一个称之为)。这就是完成处理程序模式的原因;存储收到的数据并通知你的其余代码。
因此,在完成处理程序块中执行额外工作之前,请忘记查看products
,直到您告知它已准备就绪:
- (void)reload {
products = nil;
[[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *storeProducts) {
if (success) {
products = storeProducts;
// UPDATE UI - MUST BE DONE IN MAIN THREAD
dispatch_sync(dispatch_get_main_queue(), ^{
[self.tableView reload]; // Reload the tableview
});
// CALL A PRIVATE METHOD
[self heyProductsHasUpdated];
}
}];
}
答案 2 :(得分:0)
试试这个:
- (void)reload
{
__block typeof(self) safeSelf = self;
[[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *storeProducts)
{
if (success)
{
[safeSelf setProducts:[NSArray arrayWithArray:storeProducts]];
dispatch_async(dispatch_get_main_queue(), ^{
[safeSelf.tableView reload];
});
}
}];
}
答案 3 :(得分:-1)
声明这样的产品:
__block NSArray *products = [[NSArray alloc] init];