11022
カメラとカメラロールを使って写真をコレクションビューに保存することのできるアプリを作っているのですが、画像を保存する箇所で処理が遅く数秒かかってしまい非常に煩わしいです。

SubViewController.m

```

    - (void)addSelectedPicture:(SubjectViewController *)controller item:       (UIImage *)item
    {
        //_records(NSMutableArray)
        Record *record = _records[_imageSelectionIndexPath.section];
        [record.images addObject:item];
    
        //ここが時間かかる$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$①
        [[LessonManager sharedManager] saveLessons];
    
        [self.collectionView reloadData];
    }
    
```

LessonManager.h

```

    #import <Foundation/Foundation.h>
    #import "Lesson.h"
    
    @interface LessonManager : NSObject
    
    @property (nonatomic) NSMutableArray *lessons;
    
    + (instancetype)sharedManager;
    - (void)saveLessons;
    
    @end
    
```

LessonManager.m

```

    #import "LessonManager.h"
    
    @implementation LessonManager
    
    + (instancetype)sharedManager {
        static LessonManager *manager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            manager = [[self alloc] init];
        });
        NSLog(@"１場所");
        return manager;
    }
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            self.lessons = [NSMutableArray arrayWithArray:[Lesson     fetchLessons]];
        }
        NSLog(@"２場所");
        return self;
    }
    
    - (void)saveLessons
    {
        NSLog(@"４場所");
        //ここが遅い$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$②
        [Lesson saveLessons:self.lessons];
        NSLog(@"３場所");
    }
    
    @end
    
```

Lesson.h

```

    #import <Foundation/Foundation.h>
    #import "Record.h"
    
    @interface Lesson : NSObject <NSCoding>
    
    @property (nonatomic) NSString *name;
    @property (nonatomic) NSString *teacher;
    @property (nonatomic) NSString *room;
    @property (nonatomic) NSMutableArray *records;
    
    + (NSArray *)fetchLessons;
    + (void)saveLessons:(NSArray *)lessons;
    
    @end
    
```

Lesson.m

```

    #import "Lesson.h"
    
    @implementation Lesson
    
    + (NSArray *)fetchLessons
    {
        NSLog(@"８場所");
        NSUserDefaults *userDefaults = [NSUserDefaults  standardUserDefaults];
        NSData *data = [userDefaults dataForKey:@"lessons"];
        NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        if (!array) {
            array = [NSArray array];
        }
        return array;
    }
    
    + (void)saveLessons:(NSArray *)lessons
    {
       //ここが遅い$$$$$$$$$$$$$$$$$$$$$$$$③
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:lessons];
        NSUserDefaults *userDefaults = [NSUserDefaults  standardUserDefaults];
        [userDefaults setObject:data forKey:@"lessons"];
        [userDefaults synchronize];
    }
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            self.records = [NSMutableArray array];
        }
    return self;
    }
    
    @end
    
```

順番としては①②③と実行されていくと思うのですが、Lesson.mの  
+ (void)saveLessons:(NSArray *)lessons{}  
の③のうちの  
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:lessons];  
の部分が遅くアプリが数秒固まったようになってしまいます。

メモリは③の処理の部分で最大になります。メモリの使いすぎなのでしょうか...  
![画像の説明をここに入力](https://i.stack.imgur.com/Vhizd.png)

なにか解決する方法はありませんか、どなたかよろしくお願いします。
CC BY-SA 3.0
2015-06-04T14:49:45.540
10981
2015-06-06T02:08:47.390
2015-06-04T16:23:43.807
8802
8802
question
ios objective-c iphone
画像保存の際の処理速度が遅い
どうしてもNSUserDefaultsに保存しないといけないのであれば別ですが、そうでなければ、dataを直接ファイルに保存するようにしてはどうでしょうか？

たぶん、こんな感じになるかと思います。

```

    + (NSArray*)fetchLessons
    {
        NSLog(@"８場所");
        NSString* path = [self makeLibraryPath];
        NSData* data = [[NSData alloc] initWithContentsOfFile:path];
    
        NSArray* array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        if (!array) {
            array = [NSArray array];
        }
        return array;
    }
    
    + (void)saveLessons:(NSArray*)lessons
    {
        //ここが遅い$$$$$$$$$$$$$$$$$$$$$$$$③
        NSData* data = [NSKeyedArchiver archivedDataWithRootObject:lessons];
    
        NSString* path = [self makeLibraryPath];
        [data writeToFile:path atomically:YES];
    }
    
    /// LibraryDirectoryのファイルへのパスを生成
    + (NSString*)makeLibraryPath
    {
        NSArray* paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSString* dir = [paths objectAtIndex:0];
        return [dir stringByAppendingPathComponent:@"data.dat"];
    }
    
```

保存するパスやファイル名は、適当なものをいれてあるので自分で確認して下さい。サイズがさらに大きくなるのであれば、配列をまとめて保存するのではなく、それぞれ別に保存したほうがいいかもしれません。
CC BY-SA 3.0
2015-06-06T02:08:47.390
11022
2015-06-06T02:08:47.390
7459
10981
answer