在我的iOS Swift应用程序中,我想生成随机UUID(GUID)字符串以用作表键,并且此代码段似乎有效:
let uuid = CFUUIDCreateString(nil, CFUUIDCreate(nil))
Run Code Online (Sandbox Code Playgroud)
这样安全吗?
或者是否有更好的(推荐)方法?
我的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) Snow Leopard引入了许多新方法来使用NSURL对象来引用文件,而不是路径名或Core Services的FSRef.
但是,有一项任务我找不到基于URL的方法:测试文件是否存在.我正在寻找基于URL的版本- [NSFileManager fileExistsAtPath:
].与该方法一样,YES
如果URL描述任何内容,它应该返回,无论是常规文件,目录还是其他任何内容.
我可以尝试查找各种资源值,但是如果文件没有,则没有明确保证它们不存在,并且其中一些(例如,NSURLEffectiveIconKey)可能成本很高.
我可以使用NSFileManager fileExistsAtPath:
,但如果有更现代的方法,我宁愿使用它.
Cocoa,CF或Core Services中是否有一个简单的方法或函数可以保证/记录,告诉我给定的文件(或文件引用)URL是否指向存在的文件系统对象?
我试图掌握它,但现在对我来说两者看起来都是一样的.但是,Xcode允许创建一个控制台应用程序,可以选择使用"Core Foundation"或"Foundation".也许有人可以指出差异.
我需要创建一个CGSize来计算任意长度的任意文本的文本高度.UIKit有这个很好的方法-sizeWithFont:constrainedToSize:我的文本只受宽度约束,但不是高度.
为此,我需要为高度设置最大可能的CGFloat.
有没有像"CGFloatMax"这样的常量?
在iPhone开发中,速度至关重要.有没有人知道使用CoreFoundation类型(如CFMutableDictionaryRef)与Foundation类型(其对应的NSMutableDictionary)之间是否存在速度差异.
我认为操纵CF类型会更快,因为它不必抛出ObjC运行时消息,这是一个毫无根据的假设,有没有人真正看过这个?
-詹姆士
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]
Run Code Online (Sandbox Code Playgroud)
我曾经知道向对象发送消息就是调用方法.但是,我无法识别是什么NSSearchPathForDirectoriesInDomains
.它是C风格的功能吗?如果是,那么为什么在所有message
样式调用中我们都有功能呢?
我已经整理了一个非常简单的程序,它使用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中是否有可用的日志功能,还是我必须自己滚动?
我正在将一个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)
然后NSStream
在CFStreamCreatePairWithSocketToHost
调用之后将它们转换回子类?
根据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 ×10
objective-c ×6
cocoa ×3
foundation ×3
ios ×3
swift ×3
cocoa-touch ×2
cgfloat ×1
guid ×1
javascript ×1
macos ×1
nsarray ×1
nsurl ×1
uikit ×1
xcode ×1