Я новичок в Objective-C, я пытаюсь создать класс, который будет обрабатывать URLSession
задач для приложения, чтобы загрузить и воспроизвести песню из SoundCloud
и передать ее классу SongPlayer
используя Protocol and Delegate
.
Мой файл NetworkManager.h:
#import <Foundation/Foundation.h>
@protocol NetworkDelegateProtocol<NSObject>
-(void) didReceiveData:(id) data;
@end
@interface NetworkManager : NSObject
@property (nonatomic, weak) id<NetworkDelegateProtocol>delegate;
-(void) requestSong: (NSString *) songUrlStr;
@end
Мой файл NetworkManager.m:
#import "NetworkManager.h"
@implementation NetworkManager
-(void)requestSong: (NSString *) songUrlStr {
NSURL *url = [NSURL URLWithString:songUrlStr];
[[NSURLSession.sharedSession dataTaskWithURL: url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"failed to download song %@", error);
return;
}
[self.delegate didReceiveData:data];
}] resume];
}
@end
Мой файл SongPlayer.h:
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
#import "NetworkManager.h"
@interface SongPlayer : NSObject <NetworkDelegateProtocol ,AVAudioPlayerDelegate>
@property NetworkManager *networkManager;
@property (nonatomic, weak) AVAudioPlayer *songPlayer;
@property (nonatomic, weak) NSData *songData;
@property BOOL didDownload;
@end
И, наконец, мой файл SongPlayer.m:
#import "SongPlayer.h"
@implementation SongPlayer
NetworkManager *networkManager;
BOOL didDownload;
AVAudioPlayer *songPlayer;
NSData *songData;
-(void) didReceiveData: (NSData *) data {
songData = data;
didDownload = YES;
[songPlayer play];
}
@end
Я установил класс SongPlayer
как Delegate
в классе SongPlayerViewController
здесь:
@implementation SongPlayerViewController {
SongPlayer *songPlayer;
}
- (void)viewDidLoad {
[super viewDidLoad];
songPlayer = [[SongPlayer alloc]init];
songPlayer.networkManager.delegate = songPlayer;
NSArray *songUrlArray = [[NSArray alloc] initWithObjects: baseSongUrlStr, songId, endSongUrlStr, nil];
NSString *requestUrl = [songUrlArray componentsJoinedByString:@""];
NetworkManager *network = [[NetworkManager alloc] init];
[self setupSong];
[network requestSong:requestUrl];
} @ end
Когда я пытаюсь debug
сделать это, dataTaskWithURL
завершается, и класс NetworkManager
получает data
, но никогда не отправляет его на Delegate
.
Заранее спасибо.
PS: В моем классе NetworkManager
у меня есть еще одна задача URLSession
, чтобы получить список песен по названию, который отлично работает.