EXC_BAD_INSTRUCTION 在 ios 7(swift) 上使用 dispatch_get_global_queue 时发生
EXC_BAD_INSTRUCTION happens when using dispatch_get_global_queue on ios 7(swift)
let downloadGroup = dispatch_group_create()
var images = [UIImage]()
var errors = [NSError]()
dispatch_apply(UInt(urls.count), dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) { (i) in
dispatch_group_enter(downloadGroup)
SimpleCache.sharedInstance.getImage(urls[Int(i)], completion: { (image, error) -> () in
if let fullImage = image {
images.append(fullImage)
} else {
if let err = error {
DLog(err.description)
errors.append(err)
}
}
dispatch_group_leave(downloadGroup);
})
}
dispatch_group_notify(downloadGroup, dispatch_get_main_queue()) {
completion(images, errors)
}
以上是我的代码
在 ios8
上工作正常
但在 ios7 上,它崩溃了。下面是崩溃日志
...
Code Type: X86-64 (Native)
Parent Process: launchd_sim [16908]
Responsible: launchd_sim [16908]
User ID: 501
Date/Time: 2015-02-19 11:31:34.346 +0900
OS Version: Mac OS X 10.10.2 (14C109)
Report Version: 11
Anonymous UUID: C7FFC618-06B4-6AF8-3BCA-52E19DB5FF20
Sleep/Wake UUID: 5D2D4733-5669-4BBF-BE45-076C93211522
Time Awake Since Boot: 21000 seconds
Time Since Wake: 5400 seconds
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Application Specific Information:
CoreSimulator 110.4 - Device: iPhone 5s - Runtime: iOS 7.1 (11D167) - DeviceType: iPhone 5s
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libswiftDispatch.dylib 0x0000000112cceaea _TF8Dispatch25dispatch_get_global_queueFTVSC11qos_class_tSu_CSo8NSObject + 26
...
请帮忙,我真的用谷歌搜索了很多,但没有找到有用的东西。
dispatch_get_global_queue 不可能在 ios7 上工作,所以一定是我犯了一些愚蠢的错误。只是不要什么
顺便说一句
我在用
Mac OS X 10.10.2
xcode6.1.1
在我发布几秒钟后发现了原因。
看来不是我傻,是apple的文档
QOS_CLASS_USER_INTERACTIVE, QOS_CLASS_USER_INITIATED, QOS_CLASS_UTILITY, or QOS_CLASS_BACKGROUND
无法在 ios7 上使用,但
https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/#//apple_ref/c/func/dispatch_get_global_queue
懒得提任何一个
而是使用
DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_LOW, DISPATCH_QUEUE_PRIORITY_BACKGROUND
在我看来,你的主要问题不是全局队列,是这个方法dispatch_get_main_queue
。请查看 API 文档。 iOS8.0+才用,我选择用- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
代替
let downloadGroup = dispatch_group_create()
var images = [UIImage]()
var errors = [NSError]()
dispatch_apply(UInt(urls.count), dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) { (i) in
dispatch_group_enter(downloadGroup)
SimpleCache.sharedInstance.getImage(urls[Int(i)], completion: { (image, error) -> () in
if let fullImage = image {
images.append(fullImage)
} else {
if let err = error {
DLog(err.description)
errors.append(err)
}
}
dispatch_group_leave(downloadGroup);
})
}
dispatch_group_notify(downloadGroup, dispatch_get_main_queue()) {
completion(images, errors)
}
以上是我的代码
在 ios8
上工作正常
但在 ios7 上,它崩溃了。下面是崩溃日志
...
Code Type: X86-64 (Native)
Parent Process: launchd_sim [16908]
Responsible: launchd_sim [16908]
User ID: 501
Date/Time: 2015-02-19 11:31:34.346 +0900
OS Version: Mac OS X 10.10.2 (14C109)
Report Version: 11
Anonymous UUID: C7FFC618-06B4-6AF8-3BCA-52E19DB5FF20
Sleep/Wake UUID: 5D2D4733-5669-4BBF-BE45-076C93211522
Time Awake Since Boot: 21000 seconds
Time Since Wake: 5400 seconds
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Application Specific Information:
CoreSimulator 110.4 - Device: iPhone 5s - Runtime: iOS 7.1 (11D167) - DeviceType: iPhone 5s
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libswiftDispatch.dylib 0x0000000112cceaea _TF8Dispatch25dispatch_get_global_queueFTVSC11qos_class_tSu_CSo8NSObject + 26
...
请帮忙,我真的用谷歌搜索了很多,但没有找到有用的东西。 dispatch_get_global_queue 不可能在 ios7 上工作,所以一定是我犯了一些愚蠢的错误。只是不要什么
顺便说一句 我在用 Mac OS X 10.10.2 xcode6.1.1
在我发布几秒钟后发现了原因。 看来不是我傻,是apple的文档
QOS_CLASS_USER_INTERACTIVE, QOS_CLASS_USER_INITIATED, QOS_CLASS_UTILITY, or QOS_CLASS_BACKGROUND
无法在 ios7 上使用,但
https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/#//apple_ref/c/func/dispatch_get_global_queue
懒得提任何一个
而是使用
DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_LOW, DISPATCH_QUEUE_PRIORITY_BACKGROUND
在我看来,你的主要问题不是全局队列,是这个方法dispatch_get_main_queue
。请查看 API 文档。 iOS8.0+才用,我选择用- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
代替