Сетевой класс не отправляет данные делегату Objective-C - PullRequest
0 голосов
/ 13 марта 2019

Я новичок в 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, чтобы получить список песен по названию, который отлично работает.

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Похоже, что свойство networkManager на вашем SongPlayer может быть равно нулю при настройке делегата, поэтому ... в Objective-C ничего не происходит.

@implementation SongPlayerViewController {

    SongPlayer *songPlayer;

...

- (void)viewDidLoad {
    [super viewDidLoad];

    songPlayer = [[SongPlayer alloc]init];
    NetworkManager *network = [[NetworkManager alloc] init];   // do this here
    songPlayer.networkManager = network;                       // set before use
    songPlayer.networkManager.delegate = songPlayer;

    NSArray *songUrlArray = [[NSArray alloc] initWithObjects: baseSongUrlStr, songId, endSongUrlStr, nil];
    NSString *requestUrl = [songUrlArray componentsJoinedByString:@""];
    [self setupSong];

    [network requestSong:requestUrl];
} 
@end
0 голосов
/ 13 марта 2019

Как предложил Сачин Вас в своем комментарии, мне пришлось изменить songPlayer.networkManager.delegate = songPlayer;to network.delegate = songPlayer;во View Controller и все работает!Еще раз спасибо Сачин Вас .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...