OC 启动任务执行实践 2023-04-28 周五

2023-04-27  本文已影响0人  勇往直前888

简介

由于更熟悉OC一点,所以新工程仍然用OC,但是常见的第三方库,比如SVProgressHUD都会报错,说是找不到window
然后再试了一下,就会发现以前理所当然的[[[UIApplication sharedApplication] delegate] window]都会报错。怎么回事?

SceneDelegate

企业微信截图_0516fa97-ec90-40e0-adf8-46599ea57c67.png

如何找回windows

#import <UIKit/UIKit.h>

@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>

@property (strong, nonatomic) UIWindow * window;

@end
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

// 与SceneDelegate中的window是同一个;
// 很多第三方库,比如SVProgressHUD要用到;
// 自己以view的方式做弹窗也要用到;
@property (nonatomic, strong) UIWindow *window;

@end
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    
    /// 兼容以前的用法
    [UIApplication sharedApplication].delegate.window = self.window;
}

入口点

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    /// 初始化
    [WGBInitial start];
    
    return YES;
}

初始化方法

#import "WGBInitial.h"
#import <Sentry/Sentry.h>

@implementation WGBInitial

/// 开始初始化;从AppDelegate迁移到这里
+ (void)start {
    /// 初始化内容放入子线程中,防止拖慢启动速度
    NSOperationQueue *initialQueue = [[NSOperationQueue alloc] init];
    initialQueue.name = @"初始化队列";
    [initialQueue addOperationWithBlock:^{
        NSLog(@"子线程初始开始……");
        
        /// 友盟统计
        [WGBStatistics setupYouMeng];
        
        /// 腾讯Bugly
        [WGBStatistics setupBugly];
        
        /// AvoidCrash
        [WGBStatistics setupAvoidCrash];
        
        /// 阿里云鉴权参数
        [WGBUploader getStsInfo];
        
        /// 需要放主线程的初始化
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"主线程初始开始……");
            
            /// 初始化Sentry
            [WGBStatistics setupSentry];
        }];
    }];
}

@end

关于多线程

以前一直不用,估计是被那么多的概念搞怕了,习惯性使用GCD;所以,准备简化使用NSOperationQueue,当做今后多线程的主要使用方式。

至于queue.maxConcurrentOperationCount = 1;千万不要用,没有意义,还增加了理解上的复杂程度

简单起见,果断扔掉NSInvocationOperation,只考虑NSBlockOperation

- (void)addOperationWithBlock:(void (^)(void))block;
- (void)addBarrierBlock:(void (^)(void))barrier

这个相当于dispatch_barrier_async,使用得当,完全可以替代dispatch_group

上一篇 下一篇

猜你喜欢

热点阅读