2011-02-06 2 views
1

NSTaskが機能していません。私はそれが議論と関係していると思う。ここに私のコードは次のとおりです。Cocoa question - NSTaskが機能しない

- (IBAction)downloadFile:(id)sender { 

    // allocate our stuff :D 
    progressIndication = [[NSProgressIndicator alloc] init]; 
    NSTask *downloader = [[NSTask alloc] init]; 

    // set up the downloader task 
    [downloader setLaunchPath:@"/usr/bin/curl"]; 
    [downloader setArguments:[NSArray arrayWithObject:[NSString stringWithFormat:@"-LO %@", downloadURL]]]; 

    // go to the Desktop! 
    system("cd ~/Desktop"); 

    // start progress indicator 
    [progressIndication startAnimation:self]; 

    // download! 
    [downloader launch]; 

    // stop the progress indicator, everything is done! :D 
    [progressIndication stopAnimation:self]; 



} 

おかげ

+1

Cocoaの組み込みクラスの多くはあなたのためにそれを行うことができますが、カールするために砲弾でファイルをダウンロードすることはかなり無意味なようです。ダウンロードしたファイルで何をしていますか? – arrtchiu

+1

関連のないメモでは、進行状況インジケータを割り当ててアニメーション化するように指示するだけでは、まったく何もできません。あなたは何とかそれをあなたのインターフェースの残りの部分に接続しなければなりません(初心者のためにInterface Builderを使うのが一番です)。 –

+0

ちなみに、私の解決策があなたの質問に答えたと思うなら、答えとしてマークすることを忘れないでください(私のポストの矢印アイコンをクリックしてください)! ;) –

答えて

3

あなたが本当にこれを行うにはcurlを使用する必要はありません。ただ、はるかに容易タスクを達成するためにNSDataを使用します。

NSData *data = [NSData dataWithContentsOfURL:downloadURL]; 
[data writeToFile:[[NSString stringWithFormat:@"~/Desktop/%@", [downloadURL lastPathComponent]] stringByExpandingTildeInPath] atomically:YES]; 

あなたはこのためにcurlを使用する必要があると主張した場合、あなたはいくつかのために動作しません。これは、あなたのコードを修正する必要があるとしています理由。まず第一に、あなたの議論は間違っています。あなたは、次のコードを持っている必要があります。第二に、system("cd ~/Desktop")は無意味である

[downloader setArguments:[NSArray arrayWithObjects:@"-L", @"-O", [downloadURL absoluteString], @"-o", [NSString stringWithFormat:@"~/Desktop/%@", [downloadURL lastPathComponent]], nil]; 

を。それを取り除く。
最後に、NSTaskが同時に実行されます。 [downloader launch]が操作を開始し、コードが続行されます。

[downloader launch]; 
[downloader waitUntilExit]; // block until download completes 
[progressIndication stopAnimation:self]; 
+1

+1:しかし、 'system(" cd〜/ Desktop ")'は、 'curl'が継承しているカレントディレクトリを変更します。これを行うのは悪い方法ですが、起動ディスクのルートではなくデスクトップにファイルを保存する 'curl 'という目標を達成しています。より良い方法は、タスクに 'setCurrentDirectoryPath:'メッセージを送ることです。第二に、NSDataソリューションは必然的にブロックされます。 NSTaskは、少なくとも非同期にする機会を提供します。より良い解決策はNSURLDownloadです。 http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLDownload_Class/ –

+1

@Peter Hosey私は数年前にLinuxのボックスで作業をしていました。実行中のプロセスの環境に影響を与えるが、 'system'自身が起動したシェルにとってはローカルだった。 – Richard

+0

@リチャードああ、非常に良い点。 'cd〜/ Desktop'はシェルの作業ディレクトリだけを変更しますので、'システム 'に与えると意味がありません。 –

関連する問題