Objective-C 辅助方法

Objective-C Helper Methods

我很擅长 Swift 但对 objective-C 还是陌生。当用户点击警报视图上的按钮时,需要在接下来的 24 hours.Code 中禁用该按钮,下面显示的是一种辅助方法,它将 key:userId, value:timestamp 存储在 NSUserDefaults 中 - 我从未真正使用过。我有一些顾虑。

  1. 我的辅助方法在一个只有 class 方法的 class 中,所以即使我希望我的辅助方法是私有的,它也不能因为它在 class 方法中被调用。对如何从其他对象隐藏这一点感到困惑。

  2. 更好的逻辑程序?嵌套的 if 语句看起来很难看,如果我不记得它的话可能很难阅读。

  3. 最好的做法是只复制 alertAction 输入或使用 inout,因为我只是根据逻辑启用或禁用按钮。

  4. 更好的方法名称?它的目的是 enable/disable 基于关闭逻辑警告控制器,并存储在 NSUserDefaults 中。 configXXX 看起来很通用。

提前致谢。

    + (UIAlertAction *)configureAlertAction:(UIAlertAction *)alertAction
                                    forUser:(id<BaseUser>)user {
        /// Check User defaults to see if current user has reported this user already.
        /// if not: store userID and timestamp 24 hours out in defaults and enable alert action.
        /// If so, disable action.

        NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
        UIAlertAction *modifiedAlertAction = alertAction;

        double currentDate = [[NSDate date] timeIntervalSince1970];
        double previousDate = [standardDefaults doubleForKey:user.userId];

        if (previousDate) {
            if (previousDate > currentDate) {
                // remove from userdefaults..
                [standardDefaults removeObjectForKey:user.userId];
                // enable alert
                [modifiedAlertAction setEnabled:YES];
            } else if (previousDate > currentDate) {
                [modifiedAlertAction setEnabled:NO];
            }
        } else {
            // store in NSuserdefaults
            [modifiedAlertAction setEnabled:YES];
            double expirationDate = currentDate + 86400;
            [standardDefaults setDouble:expirationDate forKey:user.userId];
        }

        return modifiedAlertAction;
    }

针对您的问题

    1. Objective-C 中并没有真正的 "private method"。您可以在此处了解更多信息 Best way to define private methods for a class in Objective-C
    1. 如果你不喜欢嵌套的 if 语句,这是我的建议

      + (UIAlertAction *)configureAlertAction:(UIAlertAction *)alertAction
                                      forUser:(id<BaseUser>)user {
        /// Check User defaults to see if current user has reported this user already.
        /// if not: store userID and timestamp 24 hours out in defaults and enable alert action.
        /// If so, disable action.
      
        NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
      
        double currentDate = [[NSDate date] timeIntervalSince1970];
        double previousDate = [standardDefaults doubleForKey:user.userId];
      
        if (!previousDate) {
          // store in NSuserdefaults
          [alertAction setEnabled:YES];
          double expirationDate = currentDate + 86400;
          [standardDefaults setDouble:expirationDate forKey:user.userId];
      
          return alertAction;
        }
      
        BOOL shouldEnableAlert = previousDate > currentDate;
        if (shouldEnableAlert) {
          // remove from userdefaults..
          [standardDefaults removeObjectForKey:user.userId];
        }
        [alertAction setEnabled:shouldEnableAlert];
      
        return alertAction;
      }
      
    1. 我认为您不必复制警报,因为我只是根据逻辑启用或禁用按钮。您不需要其他警报。
    1. 我觉得这个方法名还可以。