我有一个相当简单的应用程序,它解析RSS提要并在表格视图中显示它的内容.它可以在App Store上找到.我整合了Crashlytics崩溃报告.我最近收到两份报告.这些有点难以破译.
这发生在运行iOS 10.2.1的iPhone 6中.
这是来自运行iOS 10.2.1的iPhone 5.
虽然它说它因隐私侵犯而崩溃,但我没有访问任何需要我的应用程序权限的服务.
另外搜索com.apple.root.default-qos让我相信这可能与后台线程有关.我使用后台线程的唯一地方是解析RSS提要数据.
DispatchQueue.global(qos: .background).async {
guard let data = try? Data(contentsOf: URL) else {
return
}
do {
let xmlDoc = try AEXMLDocument(xml: data)
if let items = xmlDoc.root["channel"]["item"].all {
self.posts.removeAll()
for item in items {
let title = item["title"].value ?? ""
// ...
self.posts.append(jobPost)
}
DispatchQueue.main.async {
self.saveposts(self.posts)
self.posts.sort { $0.publishDate > $1.publishDate }
self.tableView.reloadData()
UIApplication.shared.toggleNetworkActivityIndicator(show: false)
self.toggleUI(enable: true)
if self.refreshControl.isRefreshing { self.refreshControl.endRefreshing() }
}
}
} catch let …Run Code Online (Sandbox Code Playgroud) multithreading grand-central-dispatch ios dispatch-async swift
我一直在寻找一个答案,有些人似乎可能是我需要的,但我不确定.我发现了这个问题#9152851和这个问题#2617625并在一堆链接上探讨了但我需要一些方向.
本质上,我正在调度异步调用以使用OpenCV处理图像.您可以通过此处的代码看到我将其转换为NSData*,然后再将其发送回我的代理人.
NSData *proccessedData = [NSData dataWithBytes:processedImage.data length:(processedImage.rows * processedImage.cols)];
[self.delegate onProcessedBitmapReady:proccessedData withFocusQuality:focusQuality];
Run Code Online (Sandbox Code Playgroud)
但是当我回到我的委托时,我的processedBitmap是类型(OS_dispatch_data*)并包含一个字节值.所以,当我尝试设置UIImage时,它被设置为null.
- (void)onProcessedBitmapReady:(NSData *)processedBitmap withFocusQuality:(double)focusQuality
{
//Use comverted image from self.captureCommand onComplete
UIImage *image = [[UIImage alloc] initWithData:processedBitmap];
[self saveImage:image];
}
Run Code Online (Sandbox Code Playgroud)
以下是值的屏幕截图:

那么,我如何将这些字节(或者它们是什么)转换成我可以填充到UIImage中的东西呢?
预先感谢您的帮助.
-------------------------------------------------- ----- 添加新图像 -----------------------------------------

这个新图片有帮助吗?
谢谢.
我有一个创建的串行调度队列:
dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);
Run Code Online (Sandbox Code Playgroud)
我想使用这个串行队列来确保类访问的线程安全性,同时自动异步工作,不需要返回调用线程.
- (void)addObjectToQueue:(id)object
{
dispatch_async(serialQueue, ^{
// process object and add to queue
});
}
- (BOOL)isObjectInQueue:(id)object
{
__block BOOL returnValue = NO;
dispatch_sync(serialQueue, ^{
// work out return value
});
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
如果我调用addObjectToQueue:方法,然后立即调用isObjectInQueue:方法,它们是否保证以相同的顺序执行,或者is/In将首先执行isObjectInQueue?
换句话说,dispatch_async执行与dispatch_sync完全相同(立即调度块),除了它不阻塞调用线程?
我已经看到类似的问题,答案是双向的,所以我正在寻找一个明确的答案,最好用Apple文档支持.
concurrency sync objective-c grand-central-dispatch dispatch-async
以下代码将占用~410MB的内存,不会再次释放.(使用的版本dispatch_sync代替dispatch_async将需要~8MB内存)
我预计会有高内存使用率的飙升,但它应该再次下降......泄漏在哪里?
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i = 0; i < 100000; i++) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSLog(@"test");
});
}
NSLog(@"Waiting.");
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:60]];
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
NSRunLoop run循环我尝试了几种组合,从未看到内存减少(即使在等待几分钟后).我知道GCD参考指南,其中包含以下声明:
尽管GCD调度队列具有自己的自动释放池,但它们无法保证这些池何时耗尽.
这段代码中是否有内存泄漏?如果没有,有没有办法强制队列释放/排出已完成的块?
memory-leaks libdispatch grand-central-dispatch dispatch-async
我正在尝试调试我的许多用户在该领域报告的崩溃错误.所有都显示我相同的堆栈:
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 8
OS Version: iOS 9.1 (13B143)
Code Type: ARM (Native)
0 libsystem_kernel.dylib 0x392ccc84 0x392b8000 + 85124
1 libsystem_pthread.dylib 0x39370732 0x3936c000 + 18226
2 libsystem_c.dylib 0x39264f9a 0x3921a000 + 307098
3 libsystem_c.dylib 0x39264f2c 0x3921a000 + 306988
4 libsystem_c.dylib 0x392447ea 0x3921a000 + 174058
5 MyApp 0x000cb3e0 __69-[MyDataManager myMethod:]_block_invoke (MyDataManager.m:2367)
Run Code Online (Sandbox Code Playgroud)
2367行简单地说:
2363: BOOL success = [db executeUpdate:@"INSERT INTO table (id, content) VALUES (?, ?)", message.remoteId, message.content];
2364: assert(success);
2365: …Run Code Online (Sandbox Code Playgroud) 当按下主页按钮时,我的应用程序变为非活动状态,然后转到后台,但我的功能仍在执行:
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
// SOME LONG CODE (parse a NSXMLParse)
})
})
Run Code Online (Sandbox Code Playgroud)
但是当我按下Home按钮时出现错误并且我的功能"中断"(未完成,只是删除):
DATE应用程序的名称[498:53974]** - [UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:]**unhandled action - > {handler = remote; info = {(1)= 5; }; }
所以我测试了这样的东西:首先,按下主页按钮,然后按下锁定按钮.这样我就不会得到错误,一切都好.
当我的应用程序处于活动状态时按下锁定按钮时,我只有这个错误,并且在应用程序变为非活动状态和背景之前发生此错误
我正在使用iOS 9和Xcode 7 beta 5,swift 2
我试图更好地了解队列及其工作原理。这个片段是为了测试他们的行为:
- (void)dispatchQueueTest
{
NSLog( @"Begin test on %@ thread", [NSThread isMainThread] ? @"main" : @"other" );
dispatch_semaphore_t s = dispatch_semaphore_create(0);
dispatch_async( dispatch_get_main_queue(), ^{
NSLog( @"Signalling semaphore" );
dispatch_semaphore_signal(s);
});
NSLog( @"Waiting for worker" );
while( dispatch_semaphore_wait( s, DISPATCH_TIME_NOW ) ) {
NSDate* timeout = [NSDate dateWithTimeIntervalSinceNow:10.f];
// Process events on the run loop
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeout];
}
dispatch_release(s);
NSLog( @"All sync'd up" );
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它会在日志中生成以下内容:
Begin test on main thread
Waiting for worker
Signalling semaphore
All sync'd up …Run Code Online (Sandbox Code Playgroud) 我对swift中的异步任务感到非常困惑.我想做的是这样的......
func buttonPressed(button: UIButton) {
// display an "animation" tell the user that it is calculating (do not want to freeze the screen
// do some calculations (take very long time) at the background
// the calculations result are needed to update the UI
}
Run Code Online (Sandbox Code Playgroud)
我试着这样做:
func buttonPressed(button: UIButton) {
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) { () -> Void in
// display the animation of "updating"
// do the math here
dispatch_async(dispatch_get_main_queue(), {
// update the UI
}
} …Run Code Online (Sandbox Code Playgroud) 请向我解释为什么我会遇到这次崩溃?
线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)
在这
DispatchQueue.main.sync {print("sync")}
这是我的代码.
override func viewDidLoad() {
super.viewDidLoad()
print("Start")
DispatchQueue.main.async {
print("async")
}
DispatchQueue.main.sync {
print("sync")
}
print("Finish")
}
Run Code Online (Sandbox Code Playgroud) 与世界上的应用程序一样,我的 React 应用程序需要对 API 执行一些 Ajax 调用。
我选择使用 Redux 中间件,以便正确地将 API 获取与我的组件分开。
这个想法是从我的组件中分派REQUEST操作。中间件监听它们并调度SUCCESS或ERROR操作:最后这些由减速器监听。
这里很多人已经问过如何从 Redux 中间件分派操作:这不是我的问题的主题:)
首先,让我向您展示我用来编写的一个简单的减速器:
function currentUserReduxer(state = {}, action = {}) {
const { currentUser, error } = action.payload;
switch (action.type) {
case 'GET_CURRENT_USER_REQUEST':
return { ...state, isFetching: true, error: null };
case 'GET_CURRENT_USER_SUCCESS':
return { ...state, id: currentUser.id, isFetching: false };
case 'GET_CURRENT_USER_FAILURE':
return { ...state, isFetching: false, error };
default:
return state;
}
}
Run Code Online (Sandbox Code Playgroud)
以及相应的中间件:
() => …Run Code Online (Sandbox Code Playgroud) dispatch-async ×10
ios ×4
objective-c ×3
swift ×3
swift2 ×2
concurrency ×1
ios9 ×1
javascript ×1
libdispatch ×1
memory-leaks ×1
nsrunloop ×1
opencv ×1
redux ×1
sigabrt ×1
sync ×1
uiimage ×1