标签: core-foundation

从Swift在iOS上生成UUID

在我的iOS Swift应用程序中,我想生成随机UUID(GUID)字符串以用作表键,并且此代码段似乎有效:

let uuid = CFUUIDCreateString(nil, CFUUIDCreate(nil))
Run Code Online (Sandbox Code Playgroud)

这样安全吗?

或者是否有更好的(推荐)方法?

cocoa-touch guid core-foundation ios swift

288
推荐指数
6
解决办法
14万
查看次数

iOS启动后台线程

我的iOS设备上有一个小的sqlitedb.当用户按下按钮时,我从sqlite获取数据并将其显示给用户.

这个抓取部分我想在后台线程中执行它(不阻止UI主线程).我是这样做的 -

[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];

在获取和稍微处理之后,我需要更新UI.但是因为(作为一种好的做法)我们不应该从后台线程执行UI更新.我这样打电话给selector主线程 -

[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];

但我的应用程序在第一步崩溃了.即启动后台线程.这不是在iOS中启动后台线程的方法吗?

更新1:之后[self performSelectorInBackground....我得到这个堆栈跟踪,没有资料什么那么-

在此输入图像描述

更新2:我甚至试过,开始这样的后台线程 - [NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];但我仍然得到相同的堆栈跟踪.

就这样我澄清一下,当我在主线程上执行此操作时,一切运行顺畅......

更新3这是我尝试从后台运行的方法

- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
    SpotMain *mirror = [[SpotMain alloc] init];
    NSMutableArray *filteredDocids = toProceessDocids;

    if(![gMediaBucket isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
    if(![gMediaType isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
    if(![gPlatform isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];

    self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
    [filteredDocids release];
    [mirror release];

    [self performSelectorOnMainThread:@selector(showResults) withObject:nil …
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c core-foundation uikit ios

117
推荐指数
2
解决办法
17万
查看次数

使用NSURL测试文件是否存在

Snow Leopard引入了许多新方法来使用NSURL对象来引用文件,而不是路径名或Core Services的FSRef.

但是,有一项任务我找不到基于URL的方法:测试文件是否存在.我正在寻找基于URL的版本- [NSFileManager fileExistsAtPath:].与该方法一样,YES如果URL描述任何内容,它应该返回,无论是常规文件,目录还是其他任何内容.

我可以尝试查找各种资源值,但是如果文件没有,则没有明确保证它们不存在,并且其中一些(例如,NSURLEffectiveIconKey)可能成本很高.

我可以使用NSFileManager fileExistsAtPath:,但如果有更现代的方法,我宁愿使用它.

Cocoa,CF或Core Services中是否有一个简单的方法或函数可以保证/记录,告诉我给定的文件(或文件引用)URL是否指向存在的文件系统对象?

cocoa nsurl core-foundation nsfilemanager osx-snow-leopard

70
推荐指数
3
解决办法
4万
查看次数

Foundation Framework和Core Foundation Framework之间的区别?

我试图掌握它,但现在对我来说两者看起来都是一样的.但是,Xcode允许创建一个控制台应用程序,可以选择使用"Core Foundation"或"Foundation".也许有人可以指出差异.

cocoa cocoa-touch objective-c core-foundation foundation

64
推荐指数
3
解决办法
1万
查看次数

最大CGFloat值是否有常量?

我需要创建一个CGSize来计算任意长度的任意文本的文本高度.UIKit有这个很好的方法-sizeWithFont:constrainedToSize:我的文本只受宽度约束,但不是高度.

为此,我需要为高度设置最大可能的CGFloat.

有没有像"CGFloatMax"这样的常量?

objective-c core-foundation foundation cgfloat ios

51
推荐指数
5
解决办法
4万
查看次数

CoreFoundation与基金会

在iPhone开发中,速度至关重要.有没有人知道使用CoreFoundation类型(如CFMutableDictionaryRef)与Foundation类型(其对应的NSMutableDictionary)之间是否存在速度差异.

我认为操纵CF类型会更快,因为它不必抛出ObjC运行时消息,这是一个毫无根据的假设,有没有人真正看过这个?

-詹姆士

cocoa core-foundation foundation

27
推荐指数
2
解决办法
1万
查看次数

什么是NSSearchPathForDirectoriesInDomains?

[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]
Run Code Online (Sandbox Code Playgroud)

我曾经知道向对象发送消息就是调用方法.但是,我无法识别是什么NSSearchPathForDirectoriesInDomains.它是C风格的功能吗?如果是,那么为什么在所有message样式调用中我们都有功能呢?

objective-c core-foundation

24
推荐指数
2
解决办法
3万
查看次数

JavaScriptCore console.log

我已经整理了一个非常简单的程序,它使用JavaScriptCore来评估JS:

#import <CoreFoundation/CoreFoundation.h>
#import <JavaScriptCore/JavaScriptCore.h>

int main(int argc, const char * argv[])
{
    JSGlobalContextRef ctx = JSGlobalContextCreate(NULL);

    FILE *f = fopen(argv[1],"r");
    char * buffer = malloc(10000000);
    fread(buffer,1,10000000,f);

    CFStringRef strs = CFStringCreateWithCString(NULL, buffer, kCFStringEncodingASCII);

    JSStringRef jsstr = JSStringCreateWithCFString(strs);
    JSValueRef result = JSEvaluateScript(ctx, jsstr, NULL, NULL, 0, NULL);

    double res  = JSValueToNumber(ctx, result, NULL);
    JSGlobalContextRelease(ctx);

    printf("%lf\n", res);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里的想法是最后一个值应该是a Number,并打印该值.这适用于有效的JavaScript代码,例如

var square = function(x) { return x*x; }; square(4)
Run Code Online (Sandbox Code Playgroud)

但是,如果代码尝试执行a console.log,则程序会出现段错误.JSC中是否有可用的日志功能,还是我必须自己滚动?

javascript macos xcode objective-c core-foundation

23
推荐指数
3
解决办法
5109
查看次数

Swift中的免费桥接和指针访问

我正在将一个App从Objective-C移植到Swift,我需要使用以下方法:

CFStreamCreatePairWithSocketToHost(alloc: CFAllocator!, host: CFString!, port: UInt32, \
readStream: CMutablePointer<Unmanaged<CFReadStream>?>, \
writeStream: CMutablePointer<Unmanaged<CFWriteStream>?>)
Run Code Online (Sandbox Code Playgroud)

旧的逻辑看起来像这样(几个网站似乎都同意):

CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), port, \
                                   &readStream, &writeStream);

NSInputStream inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream outputStream = (__bridge_transfer NSOutputStream *)writeStream;
Run Code Online (Sandbox Code Playgroud)

由于免费桥接,这很好用.但是,ARC在"Swift-space"中不存在,并且类型系统已经改变.

如何将我的流变成实例

CMutablePointer<Unmanaged<CFReadStream>?>, and
CMutablePointer<Unmanaged<CFWriteStream>?>
Run Code Online (Sandbox Code Playgroud)

然后NSStreamCFStreamCreatePairWithSocketToHost调用之后将它们转换回子类?

objective-c core-foundation toll-free-bridging swift

23
推荐指数
2
解决办法
9617
查看次数

如何将CFArray转换为Swift数组?

根据Apple的"使用Swift with Cocoa和Objective-C","在Swift中,您可以互换使用每对免费桥接基础和Core Foundation类型".这使得使用Core Foundation的声音比实际更简单...

我正在尝试使用从CoreText返回的CFArray.我有这个代码:

let lines: CFArrayRef  = CTFrameGetLines(frame)
Run Code Online (Sandbox Code Playgroud)

我看到两种可能的方法来访问这个数组的成员.现在也没有为我工作.


方式#1 - 直接使用CFArray

let line: CTLineRef = CFArrayGetValueAtIndex(lines, 0)
Run Code Online (Sandbox Code Playgroud)

这会产生错误"'ConstUnsafePointer <()>',不能转换为'CTLineRef'".转换似乎不会改变此错误.

同样,我很乐意将"可互换"的行用作Swift数组,就像我说的那样.然而,

let line: CTLineRef = lines[0]
Run Code Online (Sandbox Code Playgroud)

产生错误"'CFArrayRef'没有名为'subscript'的成员"


方式#2 - 将CFArray转换为Swift数组

var linesArray: Array = [CTLineRef]()
linesArray = bridgeFromObjectiveC(lines, linesArray.dynamicType)
Run Code Online (Sandbox Code Playgroud)

在这里,我声明了一个Swift数组并将其设置为等同于桥接的CFArray.这个编译没有错误,但是当我运行它时,我在第二行遇到EXC_BREAKPOINT崩溃.也许我没有在这个上正确使用Swift语言......

core-foundation nsarray swift

22
推荐指数
3
解决办法
9778
查看次数