[UPDATE AM ENDE DER FRAGE]NSBundleResourceRequest bundlePath
Ich benutze Audio-Dateien in meiner Anwendung zu spielen.
Ich verwendete, um die Dateien in der App zu speichern, aber dann wechselte ich zu On Demand Resources
und NSBundleResourceRequest
.
Ich habe eine IBAction
, um eine zufällige Datei zu spielen, und seit ich zu ODR
bewegt, funktioniert es nicht. Das einzige, was ich verändert war NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
(Linie 3)
NSBundleResourceRequest *request1;
- (IBAction)randomPlay {
NSString *bundleRoot = [[request1 bundle] bundlePath];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil];
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.mp3'"];
NSArray *onlyMP3s = [dirContents filteredArrayUsingPredicate:fltr];
.
.
.
audio = [onlyMP3s[arc4random_uniform((uint32_t)onlyMP3s.count)]
stringByReplacingOccurrencesOfString:@".mp3" withString:@""];
[self playSelectedAudio:audio];
}
Die dirContents
wie folgt aussieht:
, wenn man annimmt, die MP3-Dateien enthalten.
Was mache ich falsch mit bundleRoot
?
Mein viewDidload
ist
- (void)viewDidLoad {
[super viewDidLoad];
tagsSet = [NSSet setWithObjects:@"sounds", nil];
request1 = [[NSBundleResourceRequest alloc] initWithTags:tagsSet];
[request1 conditionallyBeginAccessingResourcesWithCompletionHandler:^
(BOOL resourcesAvailable) {
if (resourcesAvailable) {
//don't do nothing. just use the file slater
} else {
[request1 beginAccessingResourcesWithCompletionHandler:^
(NSError * _Nullable error) {
if (error == nil) {
//download the files
} else {
}
}];
}
}];
ich eigentlich ein andere Methode hat ein ausgewähltes Audio (keine gelegentlichen)
-(void)playSelectedAudio:(id)audioToPlay {
NSURL *url = [NSURL fileURLWithPath:[[request1 bundle]
pathForResource:audioToPlay ofType:@"mp3"]];
und es funktioniert gut zu spielen.
So gibt es ein Problem in der bundleRoot
, ist nicht, wo meine Dateien befinden.
[UPDATE]
Ich habe tatsächlich
- (IBAction)randomPlay {
NSURL *bundleRoot = [NSURL fileURLWithPath:[[request1 bundle]
pathForResource:@"" ofType:@"mp3"]];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *dirContents = [fm contentsOfDirectoryAtURL:bundleRoot
includingPropertiesForKeys:[NSArray array]
options:0 error:nil];
NSPredicate *fltr = [NSPredicate predicateWithFormat:
@"self ENDSWITH '.mp3'"];
NSArray *onlyMP3s = [dirContents
filteredArrayUsingPredicate:fltr];
.
.
.
audio = [onlyMP3s[arc4random_uniform((uint32_t)onlyMP3s.count)]
stringByReplacingOccurrencesOfString:@".mp3"
withString:@""];
[self playSelectedAudio:audio];
}];
}
und es ist fast funktioniert, aber ist immer das erste Audio im Verzeichnis zu spielen.
Überprüfen Sie Ihre Zufallszahl und Array-Anzahl. – bbum
hey @bbum danke für die Antwort.Diese Methode funktionierte korrekt, als ich '[NSBundle mainBundle]' benutzte, also ein zufälliges Audio von allen Audios im Verzeichnis richtig auswählte. Welchen Teil soll ich prüfen? – fabersky
* aber es spielt immer das erste Audio im Verzeichnis. * Sie haben entweder nur eine Audiodatei oder die generierte Zufallszahl ist konstant. Überprüfen Sie also den Inhalt von 'onlyMP3s'. – bbum