首页 > 解决方案 > 具有混合 shell 和 Objective C 组件的 SDK

问题描述

这里相对较新,所以请原谅这个愚蠢的问题。

我目前正在使用一组特定的商用 DSLR 型相机(第一阶段),并拥有制造商提供的 SDK。但是,SDK 有两个组件 - 一个专用于图像捕获,编写为 Objective C 框架,另一个专用于图像处理,编写为 shell 命令列表。

我想构建一个带有用户界面的程序,允许我为捕获和处理设置序列。

使用 Objective C 框架运行相机相对简单,我刚刚使用界面生成器构建了一个 Cocoa 应用程序。但是将它与处理引擎集成的最佳方法是什么,我似乎只能从外壳运行?

到目前为止,我已经使用 NSTask 调用了一些我单独编写的 bash 脚本,而且效果很好......但是现在我需要保存一些命令行输出,这些输出是在我的 shell 脚本处理完文件后返回的作为整个应用程序中的变量。

我读过的所有地方都说没有优雅的方法可以做到这一点,并且解决它的方法(写入文件,从该文件读取主程序等)是很大的安全风险。

所以我认为必须有更好的方法来集成 SDK 的这两部分。还是我的方法没问题,并且有一种安全的方法可以将终端输出拉到我的程序中?提前致谢。

标签: bashcocoasdkintegrationnstask

解决方案


您可以从 NSTask 中读取 STDOUT。这是一个帮助您入门的示例:

NSPipe  *readPipe=NSPipe.pipe;

readPipe.fileHandleForReading.readabilityHandler=^(NSFileHandle *fh){

    NSData  *data=fh.availableData;

    if(!data)
    {
        NSLog(@"Script STDOUT closed!");

        fh.readabilityHandler=NULL;

        return;
    }

    // process the data here
    NSString *s=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    // NOTE: there is no guarantee what kind of chunk size your data
    // comes in! You may need to concatenate strings until it is complete
};


NSTask  *task=NSTask.new;

// set up your task as normal

task.standardOutput=readPipe;

[task launch];

推荐阅读