1

У меня есть менеджер Notification Manager, который должен размещать все уведомления в основном потоке. Но у меня есть отчеты о сбоях. Приложение сбой в этой строке:NSNotification post при авариях основного потока

dispatch_sync(dispatch_get_main_queue(), ^{ 
       [[NSNotificationCenter defaultCenter] postNotificationName:aName object:anObject]; 

Я хотел бы получить совет, как исправить это. Thx заранее

#import "NotificationManager.h" 

@interface NotificationManager() 
{ 
    NSNotificationCenter *center; 
} 
@end 

@implementation NotificationManager 

+ (NotificationManager *) sharedInstance 
{ 
    static NotificationManager *instance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     instance = [[NotificationManager alloc] init]; 
    }); 
    return instance; 
} 

- (void) postNotificationName:(NSString *)aName object:(id)anObject 
{ 
    if (dispatch_get_current_queue() != dispatch_get_main_queue()) 
    { 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      [[NSNotificationCenter defaultCenter] postNotificationName:aName object:anObject]; 
     }); 
    } 
    else 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:aName object:anObject]; 
    } 
} 
@end 

Отчет об ошибке:

7 PLR 0x000e5d40 __51-[NotificationManager postNotificationName:object:]_block_invoke in NotificationManager.m on Line 27 
8 libdispatch.dylib 0x39a14a88 _dispatch_barrier_sync_f_slow_invoke 
9 libdispatch.dylib 0x39a105da _dispatch_client_callout 
10 libdispatch.dylib 0x39a13e44 _dispatch_main_queue_callback_4CF 
11 CoreFoundation 0x318cf1b0 __CFRunLoopRun 
12 CoreFoundation 0x3184223c CFRunLoopRunSpecific 
13 CoreFoundation 0x318420c8 CFRunLoopRunInMode 
14 GraphicsServices 0x3542133a GSEventRunModal 
15 UIKit 0x3375e2b8 UIApplicationMain 
16 PLR 0x000c5b4a main in main.m on Line 9 
+0

Я добавил информацию о сообщении об авариях на мой вопрос – iWheelBuy

+1

Как в стороне, [dispatch_get_current_queue] (https://developer.apple.com/library/ios/DOCUMENTATION/Performance/Reference/GCD_libdispat ch_Ref/Reference/reference.html # // apple_ref/c/func/dispatch_get_current_queue) устарел в iOS 6. Вы должны всегда удалять условное и отправлять в основную очередь. –

+0

Используя '[NSThread isMainThread]', вы можете узнать, является ли это основным потоком или нет. –

ответ

3

Я не могу сказать, является ли это исправить вашу проблему, но ваш метод -postNotificationName:object: может быть лучше написано так:

- (void) postNotificationName:(NSString *)aName object:(id)anObject 
{ 
    if (![NSThread isMainThread]) 
    { 
     dispatch_sync(dispatch_get_main_queue(), ^{ [self postNotificationName: aName object: anObject]; }); 
     return; 
    } 

    [[NSNotificationCenter defaultCenter] postNotificationName:aName object:anObject]; 
} 
+0

Прекрасно работает. Я собираюсь реализовать это изменение в следующем обновлении приложения – iWheelBuy

Смежные вопросы