在 ios 7(swift) 上使用 dispatch_get_global_queue 时发生 EXC_BAD_INSTRUCTION

Posted

技术标签:

【中文标题】在 ios 7(swift) 上使用 dispatch_get_global_queue 时发生 EXC_BAD_INSTRUCTION【英文标题】:EXC_BAD_INSTRUCTION happens when using dispatch_get_global_queue on ios 7(swift) 【发布时间】:2015-02-19 02:47:56 【问题描述】:
    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

【问题讨论】:

【参考方案1】:

在我发布后几秒钟就找到了原因。 看来不是我傻,而是苹果的文件

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

【讨论】:

【参考方案2】:

在我看来,你的主要问题不是全局队列,这个方法是dispatch_get_main_queue。请查看 API 文档仅在 iOS 8.0+ 中使用,我选择使用 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

【讨论】:

以上是关于在 ios 7(swift) 上使用 dispatch_get_global_queue 时发生 EXC_BAD_INSTRUCTION的主要内容,如果未能解决你的问题,请参考以下文章

在 ios 7(swift) 上使用 dispatch_get_global_queue 时发生 EXC_BAD_INSTRUCTION

Swift 中的本地通知在 iOS 7 上崩溃

用 Swift 编写的代码可以在 iOS 7 及更早版本上运行吗? [复制]

GPUImage Swift iOS 7

CLLocationManager requestWhenInUseAuthorization() 不能在 ios7 上使用 swift 2.0

Swift 和 TestFlight 适用于 iOS 8 但不适用于 iOS 7