美文网首页
『ios』如何从数据源avoidNull

『ios』如何从数据源avoidNull

作者: butterflyer | 来源:发表于2021-03-06 14:56 被阅读0次

我们平时应该会遇到因为null导致崩溃的情况。
那么需要怎么处理这种情况呢?
看下下面的调用,需要做的是,在数据源请求下来之后调用safeTransferObject。


@implementation HHAvoidNull

+ (id)safeTransferObject:(id)inputObject
{
    if ([self isNsNullType:inputObject]) {
        return nil ;
    }
    
    if ([inputObject isKindOfClass:[NSDictionary class]]) {
        __block NSDictionary *resObject = inputObject ;
        [inputObject enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            if ([self isNsNullType:obj]) {
                resObject = [resObject HHAvoidNull_dictByRemoveKey:key];
            }else
            {
                id resultObject = [self safeTransferObject:obj];
                if (resultObject && ![resultObject isEqual:obj]) {
                   resObject = [resObject HHAvoidNull_dictBySetObject:resultObject forKey:key];
                }
            }
        }];
        return resObject ;
    }else if ([inputObject isKindOfClass:[NSArray class]])
    {
        __block NSArray *resObject = inputObject ;
        __block NSUInteger indexOffset = 0 ;
        [inputObject enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            
            if ([self isNsNullType:obj]) {
                NSUInteger originCount = resObject.count ;
                resObject = [resObject HHAvoidNull_arrayByRemoveObjectAtIndex:idx - indexOffset];
                indexOffset += originCount - resObject.count ;
            }
            else
            {
                id resultObject = [self safeTransferObject:obj];
                if (resultObject && ![resultObject isEqual:obj]) {
                   resObject = [resObject HHAvoidNull_arrayByReplaceObjectAtIndex:idx - indexOffset withObject:resultObject];
                }
            }

        }];
        return resObject ;
    }
    
    return inputObject ;
}

/// 判断一个对象是不是 NSNull
+ (BOOL)isNsNullType:(id)object
{
    return [object isKindOfClass:[NSNull class]] ;
}

@end

@implementation NSDictionary(HHAvoidNullSupport)

- (NSDictionary *)HHAvoidNull_dictByRemoveKey:(id<NSCopying>)key
{
    /// key 判空
    if (key == nil) {
        return self.copy;
    }
    
    if ([[self allKeys] containsObject:key]) {
        NSMutableDictionary *dictM = self.mutableCopy ;
        [dictM removeObjectForKey:key];
        return dictM.copy;
    }
    return nil;
}

- (NSDictionary *)HHAvoidNull_dictBySetObject:(id)aObject forKey:(id<NSCopying>)key
{
    /// key 判空
    if (key == nil) {
        return self.copy;
    }
    
    if ([self isKindOfClass:[NSDictionary class]]) {
        NSMutableDictionary *dictM = self.mutableCopy ;
        dictM[key] = aObject ;
        return dictM.copy;
    }
    
    return nil;
}

@end

@implementation NSArray(HHAvoidNullSupport)

- (NSArray *)HHAvoidNull_arrayByRemoveObjectAtIndex:(NSUInteger)index
{
    if (index < self.count) {
        NSMutableArray *arrM = self.mutableCopy ;
        [arrM removeObjectAtIndex:index];
        return arrM.copy;
    }
    return nil;
}

- (NSArray *)HHAvoidNull_arrayByReplaceObjectAtIndex:(NSUInteger)index withObject:(id)object
{
    if ( index < self.count) {
        NSMutableArray *arrM = self.mutableCopy ;
        arrM[index] = object ;
        return arrM.copy;
    }
    return nil;
}
``

相关文章

网友评论

      本文标题:『ios』如何从数据源avoidNull

      本文链接:https://www.haomeiwen.com/subject/iaycqltx.html