2012-06-10 4 views
0

자바 (안드로이드)에서 온 것처럼 objetive-c를 처음 접했고 약간의 AppleScript를 사용했습니다.NSTask 또는 AScript?

그래서 내 애플은 자식 커밋을하고있다. 하지만 터미널에서 사용자가보고 싶어하는 출력이 있음을 알고 있습니다. 그래서 장면 뒤에서 NSTask를 계속 사용해야합니까? 아니면 AppleScript를 사용하고 사용자가 터미널에서 계속 진행하도록해야합니까? 주로 내 push.m은 다음과 같습니다.

#import "Push.h" 

@implementation Push 

@synthesize test; 
@synthesize dirPath; 


-(IBAction)chooseFolder:(id)sender{ 

    dirPath = [self get]; 
    NSArray *array = [dirPath componentsSeparatedByString:@"/"]; 
    NSString *pub = [array lastObject]; 
    [projectName setStringValue:pub]; 

    BOOL fileyn = [self check:dirPath]; 

    if(fileyn) { 

    } else { 

    } 

} 
-(IBAction)pushAction:(id)sender { 
    [self push]; 
    [self push]; 
} 

-(void)push{ 

    if(dirPath == nil || dirPath == @"") { 
     [self chooseFolder:nil]; 
    } 

    NSString *commitText = [commitMessage stringValue]; 
    [commitMessage setStringValue:@""]; 
    commitText = [NSString stringWithFormat:@"%@",commitText]; 

    if (i == 1) { 

    } else { 
     [self runScript:dirPath:@"add" :@"*" :nil]; 
     [self runScript:dirPath:@"commit" :@"-m" :commitText]; 
     [self runScript:dirPath:@"push" :@"origin" :@"HEAD"]; 
    } 

} 

-(void) runScript:(NSString *) path:(NSString*)cmd1:(NSString *) cmd2:(NSString *) cmd3{ 

    NSTask *aTask = [[NSTask alloc] init]; 

    NSPipe *pipe; 
    pipe = [NSPipe pipe]; 
    [aTask setStandardOutput: pipe]; 

    NSFileHandle *file; 
    file = [pipe fileHandleForReading]; 

    NSArray* args = [NSArray arrayWithObjects:cmd1,cmd2,cmd3, nil]; 
    [aTask setArguments:args]; 
    [aTask setCurrentDirectoryPath:path]; 
    [aTask setLaunchPath:@"/usr/local/git/bin/git"]; 
    [aTask setArguments:args]; 
    [aTask launch]; 

    [finished setStringValue:@"finished"]; 

} 

-(IBAction)back:(id)sender{ 

    test = [[NSWindowController alloc] initWithWindowNibName:@"POP"]; 
    [test showWindow:self]; 
    [window close]; 

} 


-(BOOL)check:(NSString *) pow{ 
    BOOL isFile = [[NSFileManager defaultManager] fileExistsAtPath:pow isDirectory:NO]; 

    return isFile; 
} 


-(NSString *)get { 

    NSOpenPanel *panel = [NSOpenPanel openPanel]; 
    [panel setAllowsMultipleSelection:NO]; 
    [panel setCanChooseDirectories:YES]; 
    [panel setCanChooseFiles:NO]; 
    if ([panel runModal] != NSFileHandlingPanelOKButton) return nil; 
    return [[panel directoryURL] path]; 
} 

@end 

그럼 어떻게해야합니까? 개선 할 것이 있다면? 미리 감사드립니다!

+1

제쳐두고'=='은 objective-c에서 문자열을 비교하는 방법이 아닙니다. – vcsjones

+0

또한'git'을'/ usr/local/git/bin /'으로 하드 코딩하는 것이 좋습니다. 제기랄? 나는 기본적으로'/ usr/bin/git'에 살고 있으며, 자신의 버전을 설치하는 사람들은/usr/local/bin에있다./git' ... –

답변

1

이러한 종류의 응용 프로그램 디자인은 당신에게 달려 있습니다. 여기에는 정답이 없습니다. 그것은 당신이 성취하고자하는 것과 사용자가 무엇을하고 싶은지에 달려 있습니다. 실행중인 명령의 출력을 사용자에게 보여 주기만을 원하면 설정 한 출력 파이프를 사용하여 NSTask에서 출력을 가져 와서 사용자가 볼 수 있도록 텍스트보기로 표시하면됩니다.

그러나 대화 형 git 명령을 실행하려면 좀 더 복잡해집니다. 귀하의 질문이 '사용자가 단말기에서 계속하게하십시오'라는 의미에 대해 구체적이지 않았기 때문에 여기서 사지 않을 것입니다. 따라서 이것이 귀하가 의미하는 바가 아니라면 알려주십시오. 좋은 사용자 인터페이스와 사용자 경험의 관점에서 다른 선택의 여지가 없다면 다른 사람이 자신의 앱을 계속 사용하도록 강제하는 것이 거의 불가능합니다. 앱에서 사용자에게 결과를 표시하려면 사용자를 다른 곳으로 유도하지 않고 인앱 (맞춤보기 또는 웹보기 등)으로 실행하는 것이 가장 좋습니다. 명령을 대화식으로 사용하려면 AppleScript를 실행하는 대신 응용 프로그램에서 처리하고 사용자를 터미널에 연결하여보고보고 할 수있는 인터페이스가 필요합니다.

어쨌든 간략하게 보면 코드가 작동해야하는 것처럼 보입니다 (수정해야하는 주석의 문제를 제외하고). 문제는 언급하지 않았으므로 생각합니다. . 이것은 프로그래밍 문제가 아닙니다. 그것은 하나의 디자인이고, 당신은 그 자신에 대한 해답을 고려해야 할 것입니다. (그리고이 질문은 StackOverflow 지침에 실제로 들어 맞지 않기 때문에 닫습니다. 대답은 문제입니다. 사실이 아닌 의견의).