我正在使用新的iOS Spotify SDK。我需要为我的应用程序获取用户保存的所有曲目。结果是分页的。因此,我尝试递归使用requestNextPageWithSession:callback:直到获取了所有页面。
首先,我最初请求保存的曲目。这将成功返回首页,因此,如果还有其他页面,我将调用getNextPage()
__block SPTListPage *allPages;
[SPTRequest savedTracksForUserInSession:session callback:^(NSError *error, SPTListPage *firstPage) {
if (!error) {
allPages = firstPage;
if (firstPage.hasNextPage) {
getNextPage(firstPage);
}
else {
// All tracks were in the first page
}
}
}];
getNextPage()被声明为上面的代码块,如下所示:
Block getNextPage;
getNextPage = ^(SPTListPage *page) {
[page requestNextPageWithSession:session callback:^(NSError *error, SPTListPage *nextPage) {
if (!error) {
[allPages pageByAppendingPage:nextPage];
if (nextPage.hasNextPage) {
getNextPage(nextPage);
}
else {
// Got all pages
}
}
}];
};
仅供参考-我已将“块”定义为在全球范围内使用:
typedef void (^Block)();
问题是我第一次尝试在该块内递归使用getNextPage()时,该行崩溃并在该行上显示EXC_BAD_ACCESS。 stacktrace并没有帮助,但看起来好像已释放getNextPage。希望有人解决了类似的问题。
最佳答案
您必须保存对块的引用,否则在执行到达作用域末尾时将其清除。您可以在保存它的类上创建一个属性。
@property (nonatomic, copy) Block block;
或者,您可以只使用方法。
- (void)fetchNextPage:(SPTListPage *)page {
[page requestNextPageWithSession:session callback:^(NSError *error, SPTListPage *nextPage) {
if (!error) {
[allPages pageByAppendingPage:nextPage];
if (nextPage.hasNextPage) {
[self fetchNextPage:nextPage];
}
else {
// Got all pages
}
}
}];
}