         let aikanFileName = bookUrl.md5()
         let aikanFilePath = booksPath.appending(aikanFileName)
         if let aikanModel = NSKeyedUnarchiver.unarchiveObject(withFile: aikanFilePath) as? ZSAikanParserModel {
-            self.saveAikan(aikanModel)
             return aikanModel
         } else {
-            let aikanURL = URL(fileURLWithPath: aikanFilePath)
-            if let data = try? Data(contentsOf: aikanURL) {
-                let json = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String:Any]
-                let aikanModel = ZSAikanParserModel.deserialize(from: json)
-                return aikanModel
+            if let aikanBook = aikanBooks[shelf.bookUrl] {
+                return aikanBook
+            } else {
+                let aikanURL = URL(fileURLWithPath: aikanFilePath)
+                if let data = try? Data(contentsOf: aikanURL) {
+                    let json = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String:Any]
+                    let aikanModel = ZSAikanParserModel.deserialize(from: json)
+                    if let aikan = aikanModel {
+                        aikanBooks[shelf.bookUrl] = aikan
+                    }
+                    return aikanModel
+                }
             }
         }
         return nil

        shelfModel.bookType = book.bookType
        if remove(shelfModel) {
            // save aikan
            saveAikan(book)
        }
    }
    

        shelfModel.update = book.update
        shelfModel.latestChapterName = book.latestChapterName
        if modify(shelfModel) {
            queue.async {
                self.saveAikan(book)
            }
        }
    }
    
