我有一个图像加载器类,它提供NSURL加载和来自Web的图像并执行完成块.代码实际上非常简单
- (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion
{
dispatch_async(_queue, ^{
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *image = nil;
NSURL *URL = [NSURL URLWithString:URLString];
if (URL) {
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
}
dispatch_async(dispatch_get_main_queue(), ^{
completion(image, URLString);
});
});
Run Code Online (Sandbox Code Playgroud)
}
当我更换
dispatch_async(_queue, ^{
Run Code Online (Sandbox Code Playgroud)
注释掉了
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
Run Code Online (Sandbox Code Playgroud)
图像的加载速度要快得多,这是非常合乎逻辑的(在此之前,图像将一次加载一个,现在一堆图像同时加载).我的问题是我可能有50个图像,我为所有这些调用downloadImageWithURL:completion:方法,当我使用全局队列而不是_queue时,我的应用程序最终崩溃,我看到有85个以上的线程.可能问题是我连续50次调用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)会让GCD创建太多线程吗?我认为gcd处理所有的treading并确保线程的数量不是很大,但如果不是这样的话,我有什么方法可以影响线程的数量?
我需要的是NSAttributedString从相对较大的HTML字符串创建对象并将它们(NSAttributedString-s)存储在数据库中.当然我想在后台线程中这样做.
这是一个简单的代码(失败)来演示我正在尝试做的事情:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *HTMLString = @"<p>HTML string</p>";
NSDictionary *options = @{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding)};
NSError *error = nil;
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithData:[HTMLString dataUsingEncoding:NSUTF8StringEncoding] options:options documentAttributes:nil error:&error];
});
Run Code Online (Sandbox Code Playgroud)
根据这个讨论,可能根本不可能在后台线程中执行它,因为NSAttributedString使用NSHTMLTextDocumentType选项创建WebKit需要在执行任何异步工作时旋转runloop.
但也许有人想通了这条路?我有非常简单的HTML,只是文本和链接,可能有一种方法来指定NSAttributedString从HTML 创建一个不需要任何" WebKit-rendering"?
或者可能有人可以推荐第三方lib NSAttributedString从不使用的简单HTML 创建s WebKit?
我需要一些关于a的谓词的帮助NSFetchedResultsController.我的猜测是可以用a完成,SUBQUERY但我无法弄清楚如何.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Album"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY tracks.playlistItems.playlist == %@", section.playlist];
Run Code Online (Sandbox Code Playgroud)
当使用此谓词执行获取请求时,我得到"此处不允许多对多键"错误.这是有道理的,因为专辑有多个曲目,并且曲目有多个播放列表项.
因此,在这里使用自然语言是我想要的这个谓词:一个专辑,其中至少有一个音轨至少有一个播放列表具有以下播放列表.
我可以在谓词中使用SUBQUERY实现此目的吗?
(我知道这可以通过2次获取请求轻松实现,但我想知道是否可以使用一个请求完成此操作,因为我正在使用a NSFetchedResultsController)
这是一种情况:Hockeyapp和testflight时不时地抱怨我
"试图插入零对象"
在可变字典/数组中.我知道正确的方法是一直检查nil,并且当它有意义时我会这样做.我们的测试人员无法捕获那些崩溃,但AppStore用户显然可以.
我的猜测是,有时服务器会返回NSNulls.因此,不要在巨大的项目中插入nil的检查,我的想法是为测试人员创建一个单独的目标,并使用方法调整集合类.说,我将替换insertObject:atIndex为my swizzled_insertObject:atIndex,如果对象实际上是nil ,我会在崩溃之前记录/显示描述性报告.
事情是我不能使用调酒__NSPlaceholderDictionary或__NSArrayM (因为我不能在私人课程上制作类别)这让我很难过.
所以基本上我是在寻求关于如何捕捉那些令人讨厌的罕见崩溃的建议.我想到的一个解决方案是使用try-catch块,我知道它们在Objective-c中很昂贵,所以我不会在生产中使用它们,仅供测试人员使用.但是,包围方法try-catche包围-s #ifdef- #endif-s将清除代码的所有readableness.所以我正在寻找更优雅的解决方案.谢谢.
更新:堆栈跟踪不一定不是很具描述性,这是我得到的
Exception Type: SIGABRT
Exception Codes: #0 at 0x3a378350
Crashed Thread: 0
Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]'
Last Exception Backtrace:
0 CoreFoundation 0x321522a3 <redacted> + 163
1 libobjc.A.dylib 0x39e7a97f _objc_exception_throw + 31
2 CoreFoundation 0x320a355f <redacted> + 135
3 CoreFoundation 0x320da0d3 <redacted> …Run Code Online (Sandbox Code Playgroud) 当我运行这个非常简单的代码时
c <- seq(0, 1, length.out=4)
x <- 0.5
for (l in 1:length(c)) {
if (l>1 & x>c[l-1] & x<c[l]) {
print(x)
}
}
Run Code Online (Sandbox Code Playgroud)
我在控制台中有以下错误
Error in if ((l > 1 & x > c[l - 1] & x < c[l])) { :
argument is of length zero
Run Code Online (Sandbox Code Playgroud)
最有趣的部分是,如果尝试使用"if"条件创建逻辑变量,一切正常:
> (l>1 & x>c[l-1] & x<c [l])
logical(0)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我正在寻找一种在主线程上使用两个参数执行选择器的好方法
我真的很喜欢用
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
Run Code Online (Sandbox Code Playgroud)
方法,除了现在我有两个参数.
所以基本上我有一个委托,我需要在加载图像时通知:
[delegate imageWasLoaded:(UIImage *)image fromURL:(NSString *)URLString;
Run Code Online (Sandbox Code Playgroud)
但是我可以在后台线程中调用我执行此操作的方法,并且委托将使用此图像来更新UI,因此需要在主线程中完成.所以我真的希望代理在主线程中得到通知.
所以我看到一个选项 - 我可以创建一个字典,这样我只有一个对象,它包含两个我需要传递的参数.
NSDictionary *imageData = [NSDictionary dictionaryWithObjectsAndKeys:image, @"image", URLString, @"URLstring", nil];
[(NSObject *)delegate performSelectorOnMainThread:@selector(imageWasLoaded:) withObject: imageData waitUntilDone:NO];
Run Code Online (Sandbox Code Playgroud)
但这种方法对我来说似乎不对.有没有更优雅的方式来做到这一点?也许使用NSInvocation?提前致谢.
我在使用表包时很挣扎,可打包文档中的所有示例都非常复杂,没有一个适合我knitr和Latex。有人可以帮忙在表头显示带有一些公式和多行标签的简单表格吗?
像这样:
df <- data.frame(matrix(1:9, nrow = 3))
colnames(df) <- c("first column", "second \\frac{1}{2}", "third column first line \\ second line")
Run Code Online (Sandbox Code Playgroud)
先感谢您
ios ×4
objective-c ×2
r ×2
core-data ×1
html ×1
if-statement ×1
ios-3.x ×1
ios7 ×1
knitr ×1
latex ×1
nsinvocation ×1
nspredicate ×1
runtime ×1
selector ×1
sql ×1
swizzling ×1