-1

我正在使用Spotify API运行三个 API 调用,以获取以下数据并将它们存储到我的Artist对象中:

  1. 艺术家。
  2. 那个艺人的专辑。
  3. 艺术家每张专辑的曲目。

完成后,我想将对象传递给不同的视图控制器。它看起来像这样:(NSURLSession如果必要的话可以在那里发布所有代码)

func getArtist(artistName) {
 getAlbums(artistIdString)}

func getAlbums(artistIdString) {
 a = Album
 Artist.albumsArray.append(a)
 for album in Artist.albumsArray {
 getTracks(albumIdString) 
 }
}

func getTracks (albumIdString) {
 t = Track
 for album in Artist.albumsArray {
  if idString == albumIdString {
  album.append(t)
  }
 }
}

func passArtist {  
 DataStore.sharedInstance().Artist = Artist
}
4

3 回答 3

0

2.5年后回到这个。我正在寻找的是完成语法,尽管当时我不知道那是什么或如何寻求帮助。

func getArtist(artistName: String, completion: (Artist) -> ()) {
     getAlbums(artistIdString)
}

希望这可以帮助遇到此问题的任何人。

于 2018-09-11T18:20:33.333 回答
0

在 ( or )的回调函数/块(或Apple 术语中的完成处理程序)中,针对当前对象运行检查函数并查看是否所有 3 个必需元素都在那里(如果是,则调用)。NSURLSessionNSURLSessionDataTaskArtistpassArtist

无论完成顺序如何,passArtist如果您这样做,它最终会在完成获取 3 个元素后调用。

这是一个简单的示例来演示Objective-C中的想法(根据 OP 的要求):

- (void)getArtistDataWithRequest:(NSURLRequest *)request
{
    NSURLSession         *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task    = [session dataTaskWithRequest:request
                                               completionHandler:^(NSData        *data,
                                                                   NSURLResponse *response,
                                                                   NSError       *error)
                                     {
                                         if (error)
                                         {
                                             // Something went wrong, fallback.
                                             NSLog(@"An error occurred: %@", error.localizedDescription);

                                             // You could use some error handler e.g.:
                                             // [self connectionDidFailWithError:error];

                                             return;
                                         }
                                         else if (response)
                                         {
                                             // Seems working, moving forward.
                                             [self connectionDidReceiveSpotifyServerResponse:response
                                                                                     andData:data];
                                         }

                                     }];
    [task resume];
}

- (void)connectionDidReceiveSpotifyServerResponse:(NSURLResponse *)aResponse
                                          andData:(NSData *)aResponseData
{
    // Do what you want here with the data you get, either it's album, track,
    // or whatever.

    // Assuming your "Artist" property is named "myArtist", and the "Artist"
    // class has a method to process the data you get from Spotify API:
    [_myArtist handleArtistData:aResponseData];

    // Now check your Artist object's element with another method. e.g.:
    if ([_myArtist isLoadingComplete])
    {
        // Done loading the object, pass it to view controller.
    }

    // Not yet done, do nothing for now.
}

这只是一种解决方案。一旦你有了想法,有很多方法可以实现你想要的。

于 2016-03-12T23:31:53.627 回答
-4

首先,您如何同时进行三个 API 调用?或者用户首先选择艺术家,然后您拨打电话获取专辑,然后显示专辑,然后用户选择专辑,然后您提出第三个请求?

无论哪种方式,我建议您在 Activity 类中编写 AsyncTask 类,然后您可以使用计数器等待三个调用完成,然后在 onPostExecute() 方法上构建一个 Parcelable 对象并将其传递到包中(intent.putExtra(authorObject) 在第二个Activity的onCreate方法中接收。

然后显示请求的信息(我猜你将它存储在数据库中进行缓存)

于 2016-03-12T22:52:54.260 回答